ABSTRACT:

Animal movements are often defined using the home range concept. Consequently, home ranges are determined by temporal, spatial, and individual-level processes. Within the environment, one of the key factors influencing an animal’s range and how it uses the environment is that of resources. Alterations to the environment that affect resource distribution and availability can have profound consequences on an animal’s spatial patterns. One of the best examples of this is that of golf courses. Some environmental modifications exhibited by some human altered environment can have positive effects on certain wildlife species by altering their movement patterns and foraging efforts. We analyzed data collected from 22 Gila Monsters Heloderma suspectum at a subsidized environment in Arizona from 2007 to 2013 and a non-subsidized environment. We performed both kernel density estimation and minimum convex polygons for comparability purposes. After adjusting for sex, number of fixes, and year, males in the subsidized environment had an average area of 15.9 ha while the females had an area of 5.9 ha. In the un-subsidized environment males had an average range of 38.8 ha while females had an area of 29.8 ha. This suggests that the home ranges may be smaller in subsidized environments than those of un-subsidized environments due to increases in available resources. There were also differences in home range overlap within and between sexes. In the subsidized population, there was very little male-male overlap with only two occurances, more female-female overlap and male-female overlap was increased. Male home ranges often overlapped several female home ranges. Gila Monsters may not have to invest in wide ranging foraging efforts as those populations of the un-subsidized environments.

Overview

Overview of the spatial ecology of Gila Monsters (Heloderma suspectum) at Stone Canyon Golf Club as a resource subsidized population vs. Owl Head Buttes representing the unsubsized natural population. We compared home range sizes of Heloderma suspectum between two populations. One represented a subsidized population at Stone Canyon Golf Club and the other at Owl Head Buttes representing the unsubsidized population. Stone Canyon is located in Oro Valley on the north end of Tucson, Arizona. Owl Head Buttes is located about 17 km straight line distance north west from Stone Canyon. Data at Owl Head was collected from 2000 - 2002, while fixes were collected from 2007 - 2013 at Stone Canyon. We Calculated minimum convex polygons using both 95 percent and 100 percent of the locations for each lizard, as well as 95% and 50% Kernel Density Estimations (KDE).

Figure 1 | Stone Canyon Golf Club, located in Oro Valley, Arizona on the northern edge of Tucson.

Overall Yearly Home Ranges (MCP)

Summary of home range size.

Table 1 | Pooled overall home ranges of Gila Monsters at Owl Head Buttes and Stone Canyon Golf Club. Both 100% and 95% MCPs were calculated between both populations.



Table: Home range sizes of Stone Canyon and Owl head Buttes using both 95 percent and 100 percent MCPs.

Year   Gila   Sex      Environment      Home_Range_100mcp   N100   Home_Range_95mcp   N95
-----  -----  -------  --------------  ------------------  -----  -----------------  ----
2000   1      female   nonsubsidized                25.20     42              23.00    38
_      2      male     nonsubsidized                28.70    125              24.50   112
_      3      male     nonsubsidized                82.70     89              68.40    78
_      4      male     nonsubsidized                55.60     80              40.50    73
2001   1      female   nonsubsidized                20.10     26                 NA    NA
_      2      male     nonsubsidized                23.50     10                 NA    NA
_      3      male     nonsubsidized                60.10     18                 NA    NA
_      4      male     nonsubsidized                24.40     21                 NA    NA
_      10     male     nonsubsidized                28.50     14                 NA    NA
_      11     male     nonsubsidized                10.60     22                 NA    NA
_      12     male     nonsubsidized                23.60      7                 NA    NA
_      13     female   nonsubsidized                 8.90      9                 NA    NA
_      15     female   nonsubsidized                13.00     11                 NA    NA
_      50     female   nonsubsidized                21.00     11                 NA    NA
_      51     female   nonsubsidized                 7.10      8                 NA    NA
2002   2      male     nonsubsidized                66.20     38              40.00    37
_      4      male     nonsubsidized                73.10     76              55.50    73
_      10     male     nonsubsidized                39.50    111              33.30   105
_      11     male     nonsubsidized                39.30     92              31.90    88
_      12     male     nonsubsidized                49.50     66              41.50    63
_      13     female   nonsubsidized                26.30    101              23.70    96
_      15     female   nonsubsidized                39.20     98              21.30    94
_      17     female   nonsubsidized                47.60    106              29.10   101
_      50     female   nonsubsidized                15.80     68              14.10    66
_      51     female   nonsubsidized                18.50     57              12.40    57
2007   F104   female   subsidized                    3.37     18               3.37    19
_      F114   female   subsidized                    2.51      8               0.58     7
_      F36    female   subsidized                    5.05     20               3.49    19
_      F66    female   subsidized                   10.23     22               5.56    20
_      M112   male     subsidized                   12.51     13              12.51    12
_      M14    male     subsidized                    4.66     15               3.87    14
2008   F104   female   subsidized                    4.97     53               3.47    50
_      F114   female   subsidized                   11.96     52               9.38    49
_      F135   female   subsidized                    4.07     16               1.58    15
_      F137   female   subsidized                    5.98     15               5.75    14
_      F36    female   subsidized                    9.73     54               7.55    51
_      F66    female   subsidized                   11.29     51               9.95    48
_      M119   male     subsidized                   25.01     58              20.23    55
2009   F104   female   subsidized                    7.45     64               7.25    62
_      F114   female   subsidized                   11.46     52               8.28    49
_      F135   female   subsidized                    6.21     62               5.47    58
_      F137   female   subsidized                    6.09     35               5.68    33
_      F147   female   subsidized                   17.90     50              14.04    48
_      F36    female   subsidized                    7.48     62               5.83    60
_      F66    female   subsidized                   12.20     67              11.01    66
_      M112   female   subsidized                    7.89     71               1.73    70
_      M119   male     subsidized                   22.62     18              16.37    16
_      M69    male     subsidized                    1.91     69               1.91    69
_      F146   female   subsidized                    9.94     20               8.49    17
2010   F114   female   subsidized                    9.65     44               8.30    41
_      F137   female   subsidized                    6.32     45               5.26    42
_      F147   female   subsidized                   16.65     36              14.75    34
_      F200   female   subsidized                    5.36     34               5.23    33
_      F214   female   subsidized                    7.38     27               3.01    25
_      F36    female   subsidized                   38.81     50              12.16    47
_      F66    female   subsidized                   28.96     52              16.22    49
_      M112   male     subsidized                   20.46     26              14.41    24
_      M119   male     subsidized                   17.46     31               9.70    29
_      M69    male     subsidized                   13.85     30              10.75    28
2011   F114   female   subsidized                    5.91     22               3.30    20
_      F137   female   subsidized                    4.80     33               4.28    31
_      F147   female   subsidized                   19.44     24              12.90    22
_      F200   female   subsidized                    8.35     28               7.66    27
_      F214   female   subsidized                    6.61     22               5.66    21
_      F252   female   subsidized                    3.09     17               1.60    16
_      F36    female   subsidized                   11.93     23              10.95    21
_      F66    female   subsidized                    5.72      5               0.66     4
_      M14    male     subsidized                    4.48     13               3.84    12
_      M215   male     subsidized                   11.47     16              11.47    15
_      M255   male     subsidized                    5.85     16               5.59    15
2012   F114   female   subsidized                   10.17     54               7.15    51
_      F137   female   subsidized                    2.06     13               1.36    12
_      F147   female   subsidized                   17.64     52              16.75    49
_      F252   female   subsidized                    5.19     53               3.63    50
_      F36    female   subsidized                   10.34     52              10.30    49
_      M14    male     subsidized                    4.42     13               3.77    12
_      M215   male     subsidized                   11.04     21               9.85    20
_      M255   male     subsidized                    8.21     13               5.39    12
2013   F114   female   subsidized                    1.16      7               0.28     6
_      F147   female   subsidized                    0.31      6               0.00     5
_      F252   female   subsidized                      NA      4                 NA    NA
_      F36    female   subsidized                    0.13      6               0.00     5

Overall combined mean:

Gila Monster Home Range Sizes at Stone Canyon vs. Owl Head Buttes.

Table 2 | Group 100% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Group Means of Overall 100% MCP Home Ranges

Environment     Sex        N   Home_Range_100mcp          sd         se          ci
--------------  -------  ---  ------------------  ----------  ---------  ----------
nonsubsidized   female    11           22.063636   12.287414   3.704795    8.254797
nonsubsidized   male      14           43.235714   21.672372   5.792185   12.513255
subsidized      female    38            9.839474    6.889003   1.117544    2.264359
subsidized      male      16           11.943125    6.907866   1.726966    3.680942

Table 3 | Group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Group Means of Overall 95% MCP Home
      Ranges

Environment     Sex        N   Home_Range_95mcp          sd         se          ci
--------------  -------  ---  -----------------  ----------  ---------  ----------
nonsubsidized   female     6          20.600000    6.286493   2.566450    6.597270
nonsubsidized   male       8          41.950000   13.987954   4.945489   11.694222
subsidized      female    38           7.132895    4.280606   0.694406    1.407000
subsidized      male      16           9.155000    5.071167   1.267792    2.702234

Gila Monster Yearly Home Range Shifts of 100% MCPs.

Repeated measures ANOVA for Yearly Home Ranges.

Repeated Measure ANOVA for 100% MCP overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_100mcp ~ Environment + Year + Sex + N100 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 573.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.78427 -0.39613 -0.04158  0.28298  3.08889 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 29.58    5.439   
 Residual             82.45    9.080   
Number of obs: 79, groups:  Gila, 30

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -1.025e+03  1.675e+03  7.162e+01  -0.612 0.542474    
Environmentsubsidized         -1.526e+01  8.155e+00  6.684e+01  -1.871 0.065666 .  
Year                           5.186e-01  8.368e-01  7.163e+01   0.620 0.537434    
Sexmale                        1.966e+01  4.855e+00  2.503e+01   4.049 0.000436 ***
N100                           1.938e-01  4.152e-02  5.491e+01   4.669 1.99e-05 ***
Environmentsubsidized:Sexmale -1.430e+01  6.154e+00  2.558e+01  -2.323 0.028377 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N100  
Envrnmntsbs  0.855                            
Year        -1.000 -0.856                     
Sexmale     -0.043  0.280  0.041              
N100         0.062  0.120 -0.064 -0.041       
Envrnmnts:S  0.025 -0.316 -0.024 -0.792  0.119

ANOVA Table: 100% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                 Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment      688.97  688.97     1 71.486  8.3567 0.0050859 ** 
Year              31.66   31.66     1 71.627  0.3840 0.5374340    
Sex             1375.22 1375.22     1 24.656 16.6803 0.0004079 ***
N100            1797.13 1797.13     1 54.913 21.7978 1.994e-05 ***
Environment:Sex  445.09  445.09     1 25.582  5.3986 0.0283770 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Repeated Measure ANOVA for 95% MCP overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_95mcp ~ Environment + Year + Sex + N100 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 416.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.64995 -0.31879 -0.01748  0.34209  2.09888 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 41.27    6.424   
 Residual             14.75    3.840   
Number of obs: 68, groups:  Gila, 30

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -780.82886  819.18729   39.32621  -0.953  0.34632    
Environmentsubsidized          -17.09189    5.06395   58.10150  -3.375  0.00132 ** 
Year                             0.39919    0.40924   39.32617   0.975  0.33531    
Sexmale                         21.76015    4.27723   25.46188   5.087 2.83e-05 ***
N100                             0.03035    0.03090   39.53363   0.982  0.33201    
Environmentsubsidized:Sexmale  -16.09431    5.11938   30.66852  -3.144  0.00369 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N100  
Envrnmntsbs  0.648                            
Year        -1.000 -0.651                     
Sexmale     -0.036  0.396  0.033              
N100        -0.009  0.261  0.006 -0.052       
Envrnmnts:S  0.012 -0.436 -0.010 -0.838  0.098

ANOVA Table: 95% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment     446.03  446.03     1 61.925 30.2487 7.669e-07 ***
Year             14.03   14.03     1 39.326  0.9515  0.335306    
Sex             426.44  426.44     1 29.915 28.9198 8.086e-06 ***
N100             14.22   14.22     1 39.534  0.9646  0.332015    
Environment:Sex 145.74  145.74     1 30.669  9.8835  0.003687 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table 4. Directional means of home range after being adjusted for year, sex and sample size.



Table: Adjusted Group Means of Overall Home   Ranges

Environment     Sex          lsmean         SE         df    lower.CL   upper.CL
--------------  -------  ----------  ---------  ---------  ----------  ---------
nonsubsidized   female    23.587658   6.003405   66.84223   11.604291   35.57102
subsidized      female     8.325735   3.229685   46.63307    1.827097   14.82437
nonsubsidized   male      43.244461   6.049597   66.28277   31.167013   55.32191
subsidized      male      13.683483   3.887262   49.21098    5.872585   21.49438

Post-Hoc comparisons between sexes and environment:

$emmeans
Environment = nonsubsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female  23.59 6.00 66.8    11.60     35.6
 male    43.24 6.05 66.3    31.17     55.3

Environment = subsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female   8.33 3.23 46.6     1.83     14.8
 male    13.68 3.89 49.2     5.87     21.5

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -19.66 4.86 31.6 -4.044  0.0003 

Environment = subsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male    -5.36 3.81 31.8 -1.405  0.1697 

Graphical Comparisons of Sex Within Each Environment:

Figure 6 | Pairwise comparisons of home range between sexes within each environment. If red arrows overlap those of others, then there is no significant statistical difference.

$emmeans
Sex = female:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  23.59 6.00 66.8    11.60     35.6
 subsidized      8.33 3.23 46.6     1.83     14.8

Sex = male:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  43.24 6.05 66.3    31.17     55.3
 subsidized     13.68 3.89 49.2     5.87     21.5

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Sex = female:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     15.3 8.31 68.7 1.837   0.0705 

Sex = male:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     29.6 8.69 68.3 3.403   0.0011 

Graphical Comparisons of Sex between the two populations:

Figure 7 | Paiwise comparisons of sex between environments. If red arrows overlap those of others, then there is no significant statistical difference.

At Stone Canyon, male yearly home ranges ranged from 1.91 - 25.1 ha, with a mean of 11.8 ± 1.7 S.E. ha (100% MCP), 9.2 ± 1.3 S.E. Ha (95% MCP). Female home ranges ranged from 2.06 – 38.81 ha and a mean of 9.8 ± 1.1 S.E. ha (100% MCP), 7.1 ± 0.7 S.E. ha (95% MCP). Male Gila Monsters at Owl head Buttes had home ranges that ranged from 10.6 – 82.7 ha with a mean of 43.2 ± 5.7 S.E. ha (100% MCP), 41.9 ± 4.9 S.E. ha (95% MCP). Female home ranges ranged from 7.1 – 47.6 with a mean of 22.0 ± 3.7 S.E. ha (100% MCP), 20.6 ± 2.5 S.E. ha (95% MCP). In the analyses of both populations, year had no effect on home range sizes (F = 0.38, P = 0.54), while there was a detected significant difference in home ranges between the two populations (F = 8.35, P = 0.005), as well as sex (F = 16.68, P = 0.0004). Post-Hoc analyses between sexes indicated that there was a significant difference in male home ranges between the two environments (df = 68.3, P = 0.001). There was a slight difference of female home ranges between the two environments, however it was not statistically significant (df = 68.7, P = 0.07). At stone canyon there was no major difference between male and female home ranges (df = 31.8, P = 0.16) with male home range being only 3% larger than females. Males at Owl Head Buttes had a 65% larger home range than did females, and was statistically significant (df = 31.3, P = 0.0003). Interestingly, males at Stone Canyon had smaller home ranges than did the females at Owl Head Buttes (Table x) When using 95% MCPs, male home ranges reduced by 25% and female range by 31%. At Owl Head Buttes, Gila Monsters showed a similar behavior with male home ranges reduced by 20% and female ranges reduced by 26% using 95% MCPs.

Overall Yearly Home Ranges (KDE)

Home range estimation on the Stone Canyon Gila Monsters using 95% KDEs with href bandwidth produced male home ranges ranging from 14.5 – 55.3 ha with a mean of 35.0 ± 3.3 S.E. ha. Female home ranges ranged from 10.1 – 47.8 ha with a mean of 22.9 ± 1.8 S.E. KDE estimates for male and female home ranges were 96% and 80% larger than MCP estimates. Repeated Measures analysis of KDEs suggested that there was a small significant difference between male and female home ranges at Stone Canyon (F = 5.56, P = 0.009). Year did not have an effect on home ranges (F = 0.57, P = 0.45).



Table: Yearly KDE Home Ranges

 Year  Gila   Sex      Environment    Home_Range_95kde    N   Home_Range_50kde   N50
-----  -----  -------  ------------  -----------------  ---  -----------------  ----
 2007  F104   female   subsidized                13.84   18               3.69    15
   NA  F36    female   subsidized                16.51   20               4.26    16
   NA  F66    female   subsidized                32.31   22               7.86    17
   NA  M67    male     subsidized                   NA   16               8.97    12
   NA  M112   male     subsidized                   NA   13              15.42    11
   NA  M14    male     subsidized                14.52   15               3.76    12
   NA  M67    male     subsidized                35.47   14               8.97    10
 2008  F104   female   subsidized                13.22   53               2.61    42
   NA  F114   female   subsidized                20.55   52               3.68    38
   NA  F135   female   subsidized                11.36   16               2.19    12
   NA  F137   female   subsidized                20.51   15               5.61    14
   NA  F36    female   subsidized                18.89   54               4.98    41
   NA  F66    female   subsidized                39.30   50               9.97    43
   NA  M119   male     subsidized                47.65   58              12.18    43
 2009  F104   female   subsidized                19.11   64               4.63    14
   NA  F114   female   subsidized                20.34   52               4.08    43
   NA  F135   female   subsidized                14.43   62               4.43    50
   NA  F137   female   subsidized                16.94   35               4.99    32
   NA  F147   female   subsidized                39.67   62               9.06    52
   NA  F36    female   subsidized                13.96   67               3.20    52
   NA  F66    female   subsidized                25.90   71               6.35    69
   NA  M112   female   subsidized                   NA   18              14.27    17
   NA  M119   male     subsidized                49.53   69              12.55    61
   NA  M69    male     subsidized                   NA   NA                 NA    NA
   NA  F146   female   subsidized                20.17   43               3.97    31
 2010  F114   female   subsidized                21.06   44               6.08    35
   NA  F137   female   subsidized                13.24   45               3.33    13
   NA  F147   female   subsidized                34.73   36               7.13    28
   NA  F200   female   subsidized                20.37   34               4.09    25
   NA  F214   female   subsidized                14.97   27               3.56    24
   NA  F36    female   subsidized                47.49   50               9.73    37
   NA  F66    female   subsidized                47.77   52               7.26    33
   NA  M112   male     subsidized                55.25   26               8.60    21
   NA  M119   male     subsidized                33.88   31               7.14    22
   NA  M69    male     subsidized                37.45   30              10.49    22
   NA  F146   female   subsidized                33.84    9               8.39     7
 2011  F114   female   subsidized                13.82   22               2.66    17
   NA  F137   female   subsidized                12.12   33               2.65    25
   NA  F147   female   subsidized                43.80   24               9.66    17
   NA  F200   female   subsidized                23.96   28               6.86    26
   NA  F214   female   subsidized                23.39   22               5.91    18
   NA  F252   female   subsidized                 8.55   17               1.94    14
   NA  F36    female   subsidized                34.90   23               8.81    20
   NA  M14    male     subsidized                20.36   12               5.27    10
   NA  M215   male     subsidized                46.26   16              11.74    15
   NA  M255   male     subsidized                30.10   16               8.25    15
 2012  F114   female   subsidized                21.04   54               5.41    45
   NA  F137   female   subsidized                 7.87   13               1.24    10
   NA  F147   female   subsidized                32.98   52               7.74    36
   NA  F252   female   subsidized                10.09   53               1.83    39
   NA  F36    female   subsidized                27.59   52               7.67    39
   NA  M14    male     subsidized                24.02   13               6.49    10
   NA  M215   male     subsidized                28.52   21               7.31    15
   NA  M255   male     subsidized                32.03   13               8.27    11

Table | Raw Group 95% KDE home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Raw Group Means of Overall 95% KDE Home
      Ranges

Sex        N   Home_Range_95kde         sd         se         ci
-------  ---  -----------------  ---------  ---------  ---------
female    37           22.98892   11.04627   1.815996   3.683010
male      13           35.00308   12.05755   3.344161   7.286302

Repeated measures ANOVA for KDE Home Ranges.

Repeated Measure ANOVA for 95% KDE overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_95kde ~ Year + Sex + N + (1 | Gila)
   Data: sub

REML criterion at convergence: 360.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6803 -0.5078 -0.0558  0.3847  2.7368 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 74.64    8.639   
 Residual             58.06    7.620   
Number of obs: 50, groups:  Gila, 18

Fixed effects:
              Estimate Std. Error         df t value Pr(>|t|)   
(Intercept) -1.257e+03  1.684e+03  3.999e+01  -0.746  0.45978   
Year         6.356e-01  8.380e-01  4.000e+01   0.759  0.45258   
Sexmale      1.475e+01  5.041e+00  1.771e+01   2.926  0.00913 **
N            4.485e-02  7.364e-02  3.747e+01   0.609  0.54615   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
        (Intr) Year   Sexmal
Year    -1.000              
Sexmale  0.039 -0.040       
N        0.015 -0.017  0.193

ANOVA Table for 95% KDE (subsidized)

Type III Analysis of Variance Table with Satterthwaite's method
     Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
Year  33.40   33.40     1 39.996  0.5754 0.452584   
Sex  497.09  497.09     1 17.713  8.5619 0.009133 **
N     21.54   21.54     1 37.466  0.3710 0.546150   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table | Directional means of KDE home ranges after being adjusted for year, sex and sample size.



Table: Adjusted KDE Group Means of Overall Home Ranges

Sex         lsmean         SE         df   lower.CL   upper.CL
-------  ---------  ---------  ---------  ---------  ---------
female    22.04260   2.940117   13.90396   15.73259   28.35262
male      36.79148   4.083271   19.59818   28.26272   45.32025

Seasonal Home Range

Seasonal Home Range.

Home range analysis broken down by five seasons; Emergence, Dry, Monsoon, Post Monsoon. The start of emergence was defined by when movement patterns increased from none/minimal to the start of high activity. Effort was taken to match as closely as possible to the Owl Head Buttes emergence date interval. Monsoon season was adjusted using NOAA climate data. The start of was defined when the mean dew point temperatures of three consecutive days were greater than 55 degrees.

Scaling home range analyses by seasonal estimates reduces the number or locations for each lizard. 100% MCPs were used for seasonal home range analyses to avoid any further reduction of locations for each estimation.

Seasonal home ranges at Stone Canyon varied in size between seasons but did not seem shift (Fig.___), with seasonal home ranges overlapping each other, only expanding or collapsing between seasons. Home range patterns at Stone Canyon did not display the same seasonal variation in home range sizes that was observed at Owl Head Buttes. At Stone Canyon, Gila Monsters had relatively smaller home ranges throughout the year, where the highest inflation of range size was observed during the dry season from an increase in male home ranges, 18.2 ± 5.4 S.E. ha to that of female home range sizes at 10.1 ± 2.4 S.E. ha. Females at Stone Canyon displayed similar home ranges during the monsoon season, 10.6 ± 2.5 S.E. ha. Home range sizes at Owl Head Buttes had a much larger amount of variation across seasons than did those at Stone Canyon. There were still slightly larger ranges observed during the dry season, primarily due to increased home range sizes exhibited by males 29.4 ± 4.7 S.E. ha versus females at 15.6 ± 3.8 S.E. ha. During the monsoon season, there was still yet a large influx of home ranges sizes where female home ranges increased to 22.9 ± 4.0 S.E. ha. For both populations, home ranges during the emergence and post-monsoon seasons were small, marking the beginning and ending of overwintering periods, where minimal movement is observed in both groups.

Analysis indicated that there was an effect of season (df = 3, F = 15.41, P = <0.001) as well as an interaction of environment and season (df = 3, F = 6.84, P = <0.001), indicating that changes in seasonal home ranges sizes varied between each environment. Post-Hoc analyses on the Stone Canyon data set with home range means averaged across sex, suggested that there was no significant difference in home ranges between the emergence (4.32 ± 2.55 S.E. ha) and post-monsoon seasons (5.09 ± 2.07 S.E. ha) nor dry and monsoon (12.23 ± 1.74 S.E. ha and 9.04 ± 1.78 S.E. ha). There was also no significance between emergence and dry/monsoon seasons, but there was a difference between dry and post-monsoon (df = 80.2, P = 0.04). Post-Hoc analyses on the Owl Head Buttes population indicated that there was no significant difference between emergence (3.33 ± 2.24 S.E. ha) and post-monsoon (2.36 ± 2.36 S.E.) nor dry and monsoon (18.86 ± 2.25 S.E. ha and 21.85 ± 2.03 S.E. ha) reflecting the same pattern at Stone Canyon. However, there was a significant difference between emergence and dry/monsoon (df = 69.4, P = <0.0001, and df = 68, P = <0.0001 respectively), as well as post-monsoon and dry/monsoon (df = 78.9, P = <0.0001, and df = 74, P = <0.0001). This shows a rather different pattern than seen at Stone Canyon. Pairwise analyses between the two populations indicated no difference between emergence (df = 87.7, P = 0.76) or post-monsoon (df = 89.4, P = 0.35). Differences in home range sizes between the two populations were between the dry and monsoon seasons (Fig.___). Owl Head home ranges were 58% larger than those at Stone Canyon during the dry season, and 76% larger during the monsoon season.

Table 5 | Group means of seasonal home ranges between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized). These means are averaged across sex.



Table: Raw Group Means of Seasonal Home Ranges

Environment     Season           N   Home_Range_100mcp          sd          se         ci
--------------  -------------  ---  ------------------  ----------  ----------  ---------
nonsubsidized   Dry             12          23.7166667   12.841682   3.7070742   8.159215
nonsubsidized   Emergence       10           2.8100000    3.121414   0.9870776   2.232925
nonsubsidized   Monsoon         13          23.6538462    9.446482   2.6199828   5.708452
nonsubsidized   Post_Monsoon    11           0.6909091    1.013365   0.3055411   0.680788
subsidized      Dry             17          13.0364706   10.574940   2.5647997   5.437133
subsidized      Emergence        9           2.0977778    1.649566   0.5498555   1.267969
subsidized      Monsoon         18          10.5600000    7.518662   1.7721657   3.738943
subsidized      Post_Monsoon    14           2.9885714    5.044404   1.3481737   2.912552
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_100mcp ~ Environment + Season + Sex + N + Environment *  
    Season + (1 | Gila)
   Data: seasonal

REML criterion at convergence: 638.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0273 -0.5931 -0.0665  0.2579  3.2815 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept)  4.442   2.108   
 Residual             44.819   6.695   
Number of obs: 100, groups:  Gila, 30

Fixed effects:
                                          Estimate Std. Error        df t value Pr(>|t|)
(Intercept)                               14.61312    2.89899  78.80446   5.041 2.89e-06
Environmentsubsidized                     -6.62866    2.80355  88.30266  -2.364  0.02025
SeasonEmergence                          -15.53191    3.06290  69.30082  -5.071 3.16e-06
SeasonMonsoon                              2.99228    2.88291  67.22814   1.038  0.30302
SeasonPost_Monsoon                       -16.49965    3.21222  78.88963  -5.137 1.97e-06
Sexmale                                    2.64121    1.69487  29.11504   1.558  0.12995
N                                          0.10913    0.03989  72.75357   2.735  0.00782
Environmentsubsidized:SeasonEmergence      7.62510    4.16148  75.14358   1.832  0.07087
Environmentsubsidized:SeasonMonsoon       -6.17899    3.69021  67.26127  -1.674  0.09869
Environmentsubsidized:SeasonPost_Monsoon   9.36224    3.88337  68.51543   2.411  0.01860
                                            
(Intercept)                              ***
Environmentsubsidized                    *  
SeasonEmergence                          ***
SeasonMonsoon                               
SeasonPost_Monsoon                       ***
Sexmale                                     
N                                        ** 
Environmentsubsidized:SeasonEmergence    .  
Environmentsubsidized:SeasonMonsoon      .  
Environmentsubsidized:SeasonPost_Monsoon *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm SsnEmr SsnMns SsnP_M Sexmal N      Env:SE Env:SM
Envrnmntsbs -0.629                                                        
SeasnEmrgnc -0.621  0.527                                                 
SeasonMonsn -0.581  0.562  0.524                                          
SsnPst_Mnsn -0.677  0.504  0.525  0.514                                   
Sexmale     -0.447  0.079  0.060  0.021  0.071                            
N           -0.581  0.003  0.193  0.065  0.341  0.313                     
Envrnmnt:SE  0.281 -0.614 -0.678 -0.366 -0.284  0.054  0.159              
Envrnmnt:SM  0.499 -0.696 -0.423 -0.786 -0.425 -0.051 -0.121  0.448       
Envrnm:SP_M  0.386 -0.654 -0.381 -0.407 -0.735  0.072 -0.005  0.443  0.501
Type III Analysis of Variance Table with Satterthwaite's method
                    Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment         261.63  261.63     1 26.365  5.8375 0.0229042 *  
Season             2072.56  690.85     3 78.967 15.4143 5.534e-08 ***
Sex                 108.84  108.84     1 29.115  2.4285 0.1299532    
N                   335.38  335.38     1 72.754  7.4829 0.0078202 ** 
Environment:Season  920.94  306.98     3 71.524  6.8493 0.0004028 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table 6 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.



Table: Seasonal Means by Sex Between Populations

Environment     Season         Sex        N   Home_Range_100mcp           sd          se           ci
--------------  -------------  -------  ---  ------------------  -----------  ----------  -----------
nonsubsidized   Dry            female     5          15.6600000    8.6291946   3.8590932   10.7145603
nonsubsidized   Dry            male       7          29.4714286   12.6476235   4.7803524   11.6971008
nonsubsidized   Emergence      female     5           4.4600000    3.4333657   1.5354478    4.2630866
nonsubsidized   Emergence      male       5           1.1600000    1.8242807   0.8158431    2.2651436
nonsubsidized   Monsoon        female     6          22.9833333    9.8151753   4.0070285   10.3003948
nonsubsidized   Monsoon        male       7          24.2285714    9.8668999   3.7293376    9.1253605
nonsubsidized   Post_Monsoon   female     4           1.4000000    1.4491377   0.7245688    2.3059014
nonsubsidized   Post_Monsoon   male       7           0.2857143    0.3670993   0.1387505    0.3395102
subsidized      Dry            female    11          10.1754545    8.0883118   2.4387178    5.4338018
subsidized      Dry            male       6          18.2816667   13.2661214   5.4158714   13.9219406
subsidized      Emergence      female     6           2.1133333    1.8474920   0.7542354    1.9388239
subsidized      Emergence      male       3           2.0666667    1.5326556   0.8848792    3.8073277
subsidized      Monsoon        female    11          10.6918182    8.4988679   2.5625051    5.7096172
subsidized      Monsoon        male       7          10.3528571    6.3010018   2.3815548    5.8274547
subsidized      Post_Monsoon   female    11           3.6309091    5.5527983   1.6742317    3.7304207
subsidized      Post_Monsoon   male       3           0.6333333    0.8007705   0.4623250    1.9892241

Adjusted Seasonal Means

Post-Hoc comparisons between populations for seasonal home range analysis:

$emmeans
Season = Dry:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  18.86 2.25 88.4   14.383    23.34
 subsidized     12.23 1.75 87.4    8.745    15.72

Season = Emergence:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   3.33 2.24 88.7   -1.118     7.77
 subsidized      4.32 2.55 84.7   -0.741     9.39

Season = Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  21.85 2.03 87.5   17.811    25.89
 subsidized      9.04 1.78 86.0    5.515    12.57

Season = Post_Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   2.36 2.36 87.0   -2.322     7.04
 subsidized      5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized    6.629 2.81 88.3  2.358  0.0206 

Season = Emergence:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -0.996 3.32 87.7 -0.300  0.7648 

Season = Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   12.808 2.66 87.2  4.814  <.0001 

Season = Post_Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -2.734 2.96 89.4 -0.924  0.3581 

Results are averaged over the levels of: Sex 

Graphical Comparisons of seasons between the two populatins:

Figure 11 | Pairwise comparisons of each season between environments. Overlapping red bars indicate no statistical difference.

$emmeans
Environment = nonsubsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           18.86 2.25 88.4   14.383    23.34
 Emergence      3.33 2.24 88.7   -1.118     7.77
 Monsoon       21.85 2.03 87.5   17.811    25.89
 Post_Monsoon   2.36 2.36 87.0   -2.322     7.04

Environment = subsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           12.23 1.75 87.4    8.745    15.72
 Emergence      4.32 2.55 84.7   -0.741     9.39
 Monsoon        9.04 1.78 86.0    5.515    12.57
 Post_Monsoon   5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence            15.532 3.07 69.4  5.054  <.0001 
 Dry - Monsoon              -2.992 2.89 67.3 -1.036  0.7292 
 Dry - Post_Monsoon         16.500 3.24 78.9  5.098  <.0001 
 Emergence - Monsoon       -18.524 2.91 68.0 -6.361  <.0001 
 Emergence - Post_Monsoon    0.968 3.08 73.0  0.314  0.9891 
 Monsoon - Post_Monsoon     19.492 3.03 74.0  6.426  <.0001 

Environment = subsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence             7.907 3.11 88.6  2.543  0.0602 
 Dry - Monsoon               3.187 2.28 66.0  1.395  0.5070 
 Dry - Post_Monsoon          7.137 2.68 80.2  2.666  0.0450 
 Emergence - Monsoon        -4.720 3.20 89.6 -1.475  0.4569 
 Emergence - Post_Monsoon   -0.769 2.94 77.2 -0.262  0.9937 
 Monsoon - Post_Monsoon      3.951 2.78 84.9  1.421  0.4899 

Results are averaged over the levels of: Sex 
P value adjustment: tukey method for comparing a family of 4 estimates 

Graphical Comparisons between seasons within the two populations:

Figure 12 | Pairwise comparisons between seasons within each environment against estimated marginal means. Overlapping red bars indicate no statistical difference.

$emmeans
Season = Dry:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.92 2.19 47.2    2.523     11.3
 male    20.36 2.77 48.3   14.798     25.9

Season = Emergence:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.00 2.91 45.2   -0.853     10.9
 male     5.63 4.00 49.0   -2.403     13.7

Season = Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.27 2.34 46.2    1.560     11.0
 male    11.39 2.51 48.4    6.354     16.4

Season = Post_Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.94 2.09 47.9    1.738     10.1
 male     3.09 3.99 48.5   -4.937     11.1

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate   SE   df t.ratio p.value
 female - male  -13.441 3.68 47.2 -3.653  0.0006 

Season = Emergence:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -0.632 4.73 49.0 -0.134  0.8943 

Season = Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -5.121 3.53 47.1 -1.449  0.1539 

Season = Post_Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    2.847 4.36 48.9  0.652  0.5173 

Graphical Comparisons between sex within the subsidized population:

Table 7 | Mean individual seasonal home ranges pooled from the entire study period. Missing values are depicted where no locations for that animal during that period were successfull.



Table: Seasonal Individual Home Ranges.

X        Emergence   X.1         X.2     Dry     X.3     Monsoon   X.4      Post.Monsoon   X.5   
-------  ----------  ----------  ------  ------  ------  --------  -------  -------------  ------
Lizard   Sex         Area (ha)   N       Area    N       Area      N        Area           N     
M69      Male        0.33        4.00    36.73   24.00   14.84     22.00    0.07           8.00  
M67      Male        NA          NA      5.71    9.00    7.72      7.00     NA             NA    
M255     Male        3.23        7.00    NA      NA      1.07      9.00     NA             NA    
M215     Male        2.64        7.00    8.28    11.00   7.22      12.00    NA             NA    
M14      Male        NA          NA      6.20    15.00   7.50      10.00    NA             NA    
M119     Male        NA          NA      27.84   17.00   19.98     67.00    1.55           9.00  
M112     Male        NA          NA      24.93   16.00   14.14     29.00    0.28           8.00  
F66      Female      0.33        5.00    9.60    97.00   33.65     79.00    1.36           16.00 
F36      Female      2.94        12.00   24.99   99.00   10.30     118.00   19.14          27.00 
F252     Female      1.27        8.00    2.54    14.00   6.48      30.00    0.39           9.00  
F214     Female      NA          NA      5.04    10.00   7.79      28.00    1.87           9.00  
F200     Female      NA          NA      4.71    8.00    4.23      40.00    2.05           12.00 
F147     Female      5.44        14.00   25.52   57.00   18.21     70.00    7.14           18.00 
F146     Female      NA          NA      9.55    22.00   5.97      17.00    0.03           7.00  
F137     Female      1.71        6.00    6.54    43.00   6.95      62.00    2.19           17.00 
F135     Female      NA          N       3.71    25.00   5.72      48.00    0.68           5.00  
F114     Female      0.99        12.00   13.66   99.00   10.72     84.00    4.56           24.00 
F104     Female      NA          NA      6.07    70.00   7.59      49.00    0.53           13.00 
                                                                                                 
Means    Overall     1.89                13.04           10.56              2.99                 
         Male        2.07                18.28           10.35              0.63                 
         Female      2.11                10.18           10.69              3.63                 
$emmeans
Season = Dry:
 Sex    emmean   SE   df lower.CL upper.CL
 female  14.05 3.70 32.3     6.50    21.59
 male    21.97 3.95 32.7    13.93    30.02

Season = Emergence:
 Sex    emmean   SE   df lower.CL upper.CL
 female   4.64 3.10 31.5    -1.68    10.97
 male     1.34 3.24 32.1    -5.25     7.94

Season = Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female  22.14 3.01 31.1    16.00    28.28
 male    20.34 3.24 31.8    13.74    26.95

Season = Post_Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   2.96 4.76 32.0    -6.74    12.66
 male     2.80 4.35 33.0    -6.05    11.66

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -7.924 4.39 31.6 -1.803  0.0809 

Season = Emergence:
 contrast      estimate   SE   df t.ratio p.value
 female - male    3.302 4.44 31.6  0.744  0.4622 

Season = Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    1.799 4.02 30.5  0.447  0.6581 

Season = Post_Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    0.154 4.46 31.9  0.035  0.9726 

Graphical Comparisons between sex within the non-subsidized population:

Seasonal Home Range (KDE)

Table | Raw KDE group means of seasonal home ranges between sexes at Stone Canyon (subsidized).

ANOVA Table. Seasonal KDE

Raw Seasonal KDE Means

Adjusted Seasonal KDE Means

Home Range Overlap (MCP)

Gila Monster Home Range Overlap of 100% MCPs.

Figure 13 | Interactive map: Home Range overlap by sex of 100% MCPs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

The Stone Canyon population seems to exhibit greater female-female overlap as well as considerable overlap of male-female home ranges. There appears to be limited male-male overlap, with occurance happening in only two male-male home range polygons. This finding is in contrast to the Owl Head buttes study which revealed that there was a large degree of overlap among male-female and male-male overlaps (Table x). Gillardo concluded that, in their study, the high degree of overlap in males-males interactions may be due to having larger home ranges for mate searching activities. Males may have and increased home range size to maximize their access to multiple females. She concluded that the lack of female-female overlap may be due to smaller home range sizes.

At Stone Canyon, males have reduced home range sizes (Table 6; Fig. 4). However, males still retain home range overlap with multiple females while having reduced contact with other males. This may be in response to nutrient subsidies that reduce the need to have expanded home range sizes for foraging activities for both males and females. There may also be a higher density of females as a response to resource availability and reduced range requirements. Males are not forced to expand home ranges for mate searching to the extant that individuals at Owl Head Buttes may be subject to.

Table 8 | Home range overlap of Gila Monsters at the nutrient subsidized site. Male-male overlaps only occured between two pairs of males: M14-M69 and M119-M215 at 0.5 ha. and 19.5 ha. respectively and were therefore not included in the table.

Home Range Overlap (KDE)

Figure 14 | Interactive map: Home Range overlap by sex of 95% KDEs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

LS0tCnRpdGxlOiAiU3BhdGlhbCBFY29sb2d5IEdpbGEgTW9uc3RlcnMgaW4gYSBSZXNvdXJjZSBTdWJzaWRpemVkIEVudmlyb25tZW50IgphdXRob3I6ICJNLiBQaWVyc29uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICBkZl9wcmludDogcGFnZWQKICByb3dzLnByaW50OiAxMAogIHRoZW1lOiBjb3NtbwogIGhpZ2hsaWdodDogYnJlZXplZGFyawogIG51bWJlcl9zZWN0aW9uczogeWVzCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OiB0cnVlCiAgY29sbGFwc2VkOiBmYWxzZQogIHNtb290aF9zY3JvbGw6IHRydWUKcGRmX2RvY3VtZW50OiBkZWZhdWx0CmVkaXRvcl9vcHRpb25zOiAKY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmgxLnRpdGxlIHsKICBmb250LXNpemU6IDQwcHg7CiAgZm9udC1mYW1pbHk6ICJDYWxpYnJpIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQo8L3N0eWxlPgoKIyBBQlNUUkFDVDogCkFuaW1hbCBtb3ZlbWVudHMgYXJlIG9mdGVuIGRlZmluZWQgdXNpbmcgdGhlIGhvbWUgcmFuZ2UgY29uY2VwdC4gQ29uc2VxdWVudGx5LCBob21lIHJhbmdlcyBhcmUgZGV0ZXJtaW5lZCBieSB0ZW1wb3JhbCwgc3BhdGlhbCwgYW5kIGluZGl2aWR1YWwtbGV2ZWwgcHJvY2Vzc2VzLiBXaXRoaW4gdGhlIGVudmlyb25tZW50LCBvbmUgb2YgdGhlIGtleSBmYWN0b3JzIGluZmx1ZW5jaW5nIGFuIGFuaW1hbOKAmXMgcmFuZ2UgYW5kIGhvdyBpdCB1c2VzIHRoZSBlbnZpcm9ubWVudCBpcyB0aGF0IG9mIHJlc291cmNlcy4gIEFsdGVyYXRpb25zIHRvIHRoZSBlbnZpcm9ubWVudCB0aGF0IGFmZmVjdCByZXNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGF2YWlsYWJpbGl0eSBjYW4gaGF2ZSBwcm9mb3VuZCBjb25zZXF1ZW5jZXMgb24gYW4gYW5pbWFs4oCZcyBzcGF0aWFsIHBhdHRlcm5zLiBPbmUgb2YgdGhlIGJlc3QgZXhhbXBsZXMgb2YgdGhpcyBpcyB0aGF0IG9mIGdvbGYgY291cnNlcy4gIFNvbWUgZW52aXJvbm1lbnRhbCBtb2RpZmljYXRpb25zIGV4aGliaXRlZCBieSBzb21lIGh1bWFuIGFsdGVyZWQgZW52aXJvbm1lbnQgY2FuIGhhdmUgcG9zaXRpdmUgZWZmZWN0cyBvbiBjZXJ0YWluIHdpbGRsaWZlIHNwZWNpZXMgYnkgYWx0ZXJpbmcgdGhlaXIgbW92ZW1lbnQgcGF0dGVybnMgYW5kIGZvcmFnaW5nIGVmZm9ydHMuICBXZSBhbmFseXplZCBkYXRhIGNvbGxlY3RlZCBmcm9tIDIyIEdpbGEgTW9uc3RlcnMgSGVsb2Rlcm1hIHN1c3BlY3R1bSBhdCBhIHN1YnNpZGl6ZWQgZW52aXJvbm1lbnQgaW4gQXJpem9uYSBmcm9tIDIwMDcgdG8gMjAxMyBhbmQgYSBub24tc3Vic2lkaXplZCBlbnZpcm9ubWVudC4gIFdlIHBlcmZvcm1lZCBib3RoIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24gYW5kIG1pbmltdW0gY29udmV4IHBvbHlnb25zIGZvciBjb21wYXJhYmlsaXR5IHB1cnBvc2VzLiAgQWZ0ZXIgYWRqdXN0aW5nIGZvciBzZXgsIG51bWJlciBvZiBmaXhlcywgYW5kIHllYXIsIG1hbGVzIGluIHRoZSBzdWJzaWRpemVkIGVudmlyb25tZW50IGhhZCBhbiBhdmVyYWdlIGFyZWEgb2YgMTUuOSBoYSB3aGlsZSB0aGUgZmVtYWxlcyBoYWQgYW4gYXJlYSBvZiA1LjkgaGEuICBJbiB0aGUgdW4tc3Vic2lkaXplZCBlbnZpcm9ubWVudCBtYWxlcyBoYWQgYW4gYXZlcmFnZSByYW5nZSBvZiAzOC44IGhhIHdoaWxlIGZlbWFsZXMgaGFkIGFuIGFyZWEgb2YgMjkuOCBoYS4gIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgaG9tZSByYW5nZXMgbWF5IGJlIHNtYWxsZXIgaW4gc3Vic2lkaXplZCBlbnZpcm9ubWVudHMgdGhhbiB0aG9zZSBvZiB1bi1zdWJzaWRpemVkIGVudmlyb25tZW50cyBkdWUgdG8gaW5jcmVhc2VzIGluIGF2YWlsYWJsZSByZXNvdXJjZXMuIFRoZXJlIHdlcmUgYWxzbyBkaWZmZXJlbmNlcyBpbiBob21lIHJhbmdlIG92ZXJsYXAgd2l0aGluIGFuZCBiZXR3ZWVuIHNleGVzLiBJbiB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uLCB0aGVyZSB3YXMgdmVyeSBsaXR0bGUgbWFsZS1tYWxlIG92ZXJsYXAgd2l0aCBvbmx5IHR3byBvY2N1cmFuY2VzLCBtb3JlIGZlbWFsZS1mZW1hbGUgb3ZlcmxhcCBhbmQgbWFsZS1mZW1hbGUgb3ZlcmxhcCB3YXMgaW5jcmVhc2VkLiBNYWxlIGhvbWUgcmFuZ2VzIG9mdGVuIG92ZXJsYXBwZWQgc2V2ZXJhbCBmZW1hbGUgaG9tZSByYW5nZXMuIEdpbGEgTW9uc3RlcnMgbWF5IG5vdCBoYXZlIHRvIGludmVzdCBpbiB3aWRlIHJhbmdpbmcgZm9yYWdpbmcgZWZmb3J0cyBhcyB0aG9zZSBwb3B1bGF0aW9ucyBvZiB0aGUgdW4tc3Vic2lkaXplZCBlbnZpcm9ubWVudHMuICAKCgoKIyBPdmVydmlldwpPdmVydmlldyBvZiB0aGUgc3BhdGlhbCBlY29sb2d5IG9mIEdpbGEgTW9uc3RlcnMgKCpIZWxvZGVybWEgc3VzcGVjdHVtKikgYXQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiBhcyBhIHJlc291cmNlIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbiB2cy4gT3dsIEhlYWQgQnV0dGVzIHJlcHJlc2VudGluZyB0aGUgdW5zdWJzaXplZCBuYXR1cmFsIHBvcHVsYXRpb24uIFdlIGNvbXBhcmVkIGhvbWUgcmFuZ2Ugc2l6ZXMgb2YgKkhlbG9kZXJtYSBzdXNwZWN0dW0qIGJldHdlZW4gdHdvIHBvcHVsYXRpb25zLiBPbmUgcmVwcmVzZW50ZWQgYSBzdWJzaWRpemVkIHBvcHVsYXRpb24gYXQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiBhbmQgdGhlIG90aGVyIGF0IE93bCBIZWFkIEJ1dHRlcyByZXByZXNlbnRpbmcgdGhlIHVuc3Vic2lkaXplZCBwb3B1bGF0aW9uLiBTdG9uZSBDYW55b24gaXMgbG9jYXRlZCBpbiBPcm8gVmFsbGV5IG9uIHRoZSBub3J0aCBlbmQgb2YgVHVjc29uLCBBcml6b25hLiAgT3dsIEhlYWQgQnV0dGVzIGlzIGxvY2F0ZWQgYWJvdXQgMTcga20gc3RyYWlnaHQgbGluZSBkaXN0YW5jZSBub3J0aCB3ZXN0IGZyb20gU3RvbmUgQ2FueW9uLiBEYXRhIGF0IE93bCBIZWFkIHdhcyBjb2xsZWN0ZWQgZnJvbSAyMDAwIC0gMjAwMiwgd2hpbGUgZml4ZXMgd2VyZSBjb2xsZWN0ZWQgZnJvbSAyMDA3IC0gMjAxMyBhdCBTdG9uZSBDYW55b24uIFdlIENhbGN1bGF0ZWQgbWluaW11bSBjb252ZXggcG9seWdvbnMgdXNpbmcgYm90aCA5NSBwZXJjZW50IGFuZCAxMDAgcGVyY2VudCBvZiB0aGUgbG9jYXRpb25zIGZvciBlYWNoIGxpemFyZCwgYXMgd2VsbCBhcyA5NSUgYW5kIDUwJSBLZXJuZWwgRGVuc2l0eSBFc3RpbWF0aW9ucyAoS0RFKS4KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBMT0FEIFBBQ0tBR0VTIAoKbGlicmFyeSh0aWR5dmVyc2UpIApsaWJyYXJ5KGtuaXRyKSAjICBtYWtlIHRhYmxlcwpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShyZWFkcikKbGlicmFyeShnZ3Bsb3QyKQojIGxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dmb3J0aWZ5KQpsaWJyYXJ5KG9yZGluYWwpCmxpYnJhcnkobHNtZWFucykKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KG1hcHZpZXcpCmxpYnJhcnkoYWRlaGFiaXRhdEhSKQojIGxpYnJhcnkoT3BlblN0cmVldE1hcCkKbGlicmFyeShnZ21hcCkKI2tuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS8zKSAjZm9yY2UgZmlndXJlcyB0byBiZSBjZXJ0YWluIHNpemUgYW5kIGFzcGVjdCByYXRpbwpgYGAKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCBjYWNoZT1UUlVFfQojIGdnbWFwOjpyZWdpc3Rlcl9nb29nbGUoa2V5ID0gIkFJemFTeUJqaGhFOXBlUkJtUzFoOVdZUXgxazVNRl9YQVhxVWZTcyIpCgojIHAzPC0gZ2dtYXAoZ2V0X2dvb2dsZW1hcChjZW50ZXIgPSBjKGxvbiA9IC0xMTAuOTkwODgsIGxhdCA9IDMyLjQ2ODc4KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDE1LCBzY2FsZSA9IDIsbWFwdHlwZSA9J3NhdGVsbGl0ZScsYXJjaGl2aW5nID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAnY29sb3InKSkKCiMgcDMKCkxvbmdpdHVkZTwtYygtMTEwLjk3OCwtMTEwLjk3OCwtMTEwLjk4MCwtMTEwLjk4MywtMTEwLjk4NSwtMTEwLjk4OCwtMTEwLjk5MCwtMTEwLjk5NCwtMTEwLjk5NSwKICAgICAgICAgICAgIC0xMTAuOTk3LC0xMTEuMDAzLC0xMTEuMDA0LC0xMTEuMDA0MiwtMTExLjAwMCwtMTEwLjk5NSwtMTEwLjk4NSwtMTEwLjk3OCwtMTEwLjk4KQoKTGF0aXR1ZGU8LWMoMzIuNDYzLDMyLjQ2MiwzMi40NjIsMzIuNDYxLDMyLjQ2MSwzMi40NjAsMzIuNDYyLDMyLjQ2NCwzMi40NjYsMzIuNDY4LDMyLjQ2OCwKICAgICAgICAgICAgMzIuNDY5LDMyLjQ3MywzMi40NzMzLDMyLjQ3MiwzMi40NzQsMzIuNDcxLDMyLjQ2NykKCm15Y29vcmRkYXRhIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoTG9uZ2l0dWRlLExhdGl0dWRlKSkKCnAzK2dlb21fcG9seWdvbihkYXRhPW15Y29vcmRkYXRhLGFlcyh4PUxvbmdpdHVkZSx5PUxhdGl0dWRlKSxhbHBoYT0wLjIsY29sb3VyPSJyZWQiLAogICAgICAgICAgICAgICAgZmlsbD0icmVkIikrCiAgZ2VvbV9wYXRoKGRhdGE9bXljb29yZGRhdGEsYWVzKHg9TG9uZ2l0dWRlLHk9TGF0aXR1ZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91cj0id2hpdGUiLGFscGhhPTAuNCxzaXplPTIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeD0tMTEwLjk4OSx5PTMyLjQ2OCxsYWJlbD0iU3RvbmUgQ2FueW9uIENsdWIiLGNvbG91cj0id2hpdGUiLHNpemU9MykrCiAgIyBzY2FsZWJhcih4Lm1pbiA9IC0xMTEuMDA1LCB4Lm1heCA9IC0xMTAuOTc1LAogICMgICAgICAgICB5Lm1pbiA9IDMyLjQ1NSwgeS5tYXggPSAzMi40ODAsIGFuY2hvciA9IE5VTEwsCiAgIyAgICAgICAgICBkaXN0ID0gNTAsIHRyYW5zZm9ybT1UUlVFLGRpc3RfdW5pdD0ibSIsIG1vZGVsID0gJ1dHUzg0JykrCiAgbGFicyh0aXRsZSA9ICJTQ0dDIFN0dWR5IFNpdGUgT3JvIFZhbGxleSBBcml6b25hIikKYGBgCkZpZ3VyZSAxIHwgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiwgbG9jYXRlZCBpbiBPcm8gVmFsbGV5LCBBcml6b25hIG9uIHRoZSBub3J0aGVybiBlZGdlIG9mIFR1Y3Nvbi4KCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGRpc21vKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHV0aWxzKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShzcG90aWZ5cikKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KHJhc3RlclZpcykKCiMjIFVTSU5HIERJU01POgpleHRlbnQgPC0gZXh0ZW50KC0xMzAsLTcwLDIwLDYwKQoKSC5zdXNwIDwtIGdiaWYoImhlbG9kZXJtYSIsIHNwZWNpZXMgPSAic3VzcGVjdHVtIiwgZXh0ID0gZXh0ZW50LAogICAgICAgICAgICAgZ2VvID0gVFJVRSwgc3AgPSBUUlVFLCBkb3dubG9hZCA9IFRSVUUsCiAgICAgICAgICAgICByZW1vdmVaZXJvcyA9IFRSVUUpCgpILnN1c3BfeHkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BAY29vcmRzWywxXSxILnN1c3BAY29vcmRzWywyXSkpCmNvbG5hbWVzKEguc3VzcF94eSkgPC0gYygibG9uZ2l0dWRlIiwibGF0aXR1ZGUiKQoKdXMgPC0gbWFwX2RhdGEoInN0YXRlIikKCiMgZ2dwbG90KGRhdGEgPSBILnN1c3BfeHksIGFlcyh4PWxvbmdpdHVkZSwgeT1sYXRpdHVkZSkpICsKIyAgIGdlb21fcG9seWdvbihkYXRhID0gdXMsIGFlcyh4PWxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLAojICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiMgICBnZW9tX3BvaW50KCkgKyB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKwojICAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEyMCwtMTA2KSwgeWxpbSA9IGMoMzAsNDEpKQoKIyMgIFVTSU5HIFJHQklGOgpILnN1c3BfbHUgPC0gbmFtZV9sb29rdXAocXVlcnkgPSAnaGVsb2Rlcm1hIHN1c3BlY3R1bScsIHJldHVybiA9ICdkYXRhJykKCkguc3VzcF9jb2RlIDwtIHByaW50KGFzLmludGVnZXIobmFtZXMod2hpY2gubWF4KHRhYmxlKEguc3VzcF9sdSRudWJLZXkpKSkpKQoKb2NjX2NvdW50KHRheG9uS2V5ID0gSC5zdXNwX2NvZGUsIGdlb3JlZmVyZW5jZWQgPSBUUlVFKQoKdXNhIDwtIGlzb2NvZGVzW2dyZXAoIlVuaXRlZCBTdGF0ZXMiLCBpc29jb2RlcyRuYW1lKSwgImNvZGUiXQpILnN1c3BfZGF0YSA8LSBvY2Nfc2VhcmNoKHRheG9uS2V5ID0gSC5zdXNwX2NvZGUsIAogICAgICAgICAgICAgICAgICAgcmV0dXJuID0gJ2RhdGEnLCAKICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPSB1c2EsIAogICAgICAgICAgICAgICAgICAgaGFzQ29vcmRpbmF0ZSA9IFRSVUUpCgpILnN1c3BfZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BfZGF0YSRVUyRzY2llbnRpZmljTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJGluc3RpdHV0aW9uQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJHN0YXRlUHJvdmluY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILnN1c3BfZGF0YSRVUyR2ZXJiYXRpbUxvY2FsaXR5KSkKCmNvb3JkcyA8LSBjYmluZCh0eXBlLmNvbnZlcnQoSC5zdXNwX2RhdGFbWyJVUyJdXVtbImRlY2ltYWxMb25naXR1ZGUiXV0sIGFzLmlzID0gVFJVRSksCiAgICAgICAgICAgICAgICB0eXBlLmNvbnZlcnQoSC5zdXNwX2RhdGFbWyJVUyJdXVtbImRlY2ltYWxMYXRpdHVkZSJdXSwgYXMuaXMgPSBUUlVFKSkKCkguc3VzcF9pbmZvIDwtIGNiaW5kKEguc3VzcF9kZixjb29yZHMpCgpjb2xuYW1lcyhILnN1c3BfaW5mbykgPC0gYygic3BlY2llcyIsImRhdGFzZXQiLCJzdGF0ZSIsImxvY2F0aW9uIiwibG9uZ2l0dWRlIiwibGF0aXR1ZGUiKQoKbGlicmFyeShncmlkKQpOYXZhZGEgPC0gZ3JpZC50ZXh0KHBhc3RlKCJOYXZhZGEiKSx4PTAuNTUsICB5PTAuODEpClV0YWggPC0gZ3JpZC50ZXh0KHBhc3RlKCJVdGFoIiksIHg9MC4xOSwgIHk9MC4zNikKQXJpem9uYSA8LSBncmlkLnRleHQocGFzdGUoIkFyaXpvbmEiKSwgeD0wLjU1LCAgeT0wLjgxKQpDYWxpZm9ybmlhIDwtIGdyaWQudGV4dChwYXN0ZSgiQ2FsaWZvcm5pYSIpLCB4PTAuMTksICB5PTAuMzYpCk5ldy5NZXhpY28gPC0gZ3JpZC50ZXh0KHBhc3RlKCJOZXcuTWV4aWNvIiksIHg9MC41NSwgIHk9MC44MSkKCgojIyBOb3cgd2UgYXJlIHJlYWR5IHRvIGZpbmFsaXplIHRoZSBhZXN0aGV0aWNzIGFuZCBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBuZXcgZ2JpZiBkYXRhLgpnZ3Bsb3QoZGF0YSA9IEguc3VzcF9pbmZvLCBhZXMoeD1sb25naXR1ZGUsIHk9bGF0aXR1ZGUpKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1cywgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzdGF0ZSkpICsKICBjb29yZF9maXhlZCh4bGltID0gYygtMTE5LC0xMDcpLCB5bGltID0gYygzMSw0MSkpICsKICB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKyBnZ3RpdGxlKCJVUyBHaWxhIE1vbnN0ZXIgRGlzdHJpYnV0aW9uIikgKyAKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKCJMZWdlbmQiKSkgKyAKICB0aGVtZV9idygpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKwogIHRoZW1lKGxlZ2VuZC50aXRsZS5hbGlnbiA9IDAuNSwgbGVnZW5kLmJveC5qdXN0ID0gImNlbnRlciIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQogICAgICAjIGFubm90YXRpb25fY3VzdG9tKE5hdmFkYSkgKyBhbm5vdGF0aW9uX2N1c3RvbShVdGFoKSArIGFubm90YXRpb25fY3VzdG9tKEFyaXpvbmEpICsKICAgICAgIyBhbm5vdGF0aW9uX2N1c3RvbShDYWxpZm9ybmlhKSArIGFubm90YXRpb25fY3VzdG9tKE5ldy5NZXhpY28pKQpgYGAKCgoKYGBge3IgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmJpb2NsaW0gPC0gZ2V0RGF0YShuYW1lID0gIndvcmxkY2xpbSIsIHJlcyA9IDIuNSwgdmFyID0gImJpbyIsIHBhdGggPSAiLi9EYXRhLyIpCgpuYW1lcyhiaW9jbGltKSA8LSBjKCJBbm4gTWVhbiBUZW1wIiwiTWVhbiBEaXVybmFsIFJhbmdlIiwiSXNvdGhlcm1hbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgIlRlbXBlcmF0dXJlIFNlYXNvbmFsaXR5IiwiTWF4IFRlbXAgV2FybWVzdCBNbyIsIk1pbiBUZW1wIENvbGRlc3QgTW8iLAogICAgICAgICAgICAgICAgICAgICJBbm4gVGVtcCBSYW5nZSIsIk1lYW4gVGVtcCBXZXR0ZXN0IFF0ciIsIk1lYW4gVGVtcCBEcmllc3QgUXRyIiwKICAgICAgICAgICAgICAgICAgICAiTWVhbiBUZW1wIFdhcm1lc3QgUXRyIiwiTWVhbiBUZW1wIENvbGRlc3QgUXRyIiwiQW5udWFsIFByZWNpcCIsCiAgICAgICAgICAgICAgICAgICAgIlByZWNpcCBXZXR0ZXN0IE1vIiwiUHJlY2lwIERyaWVzdCBNbyIsIlByZWNpcCBTZWFzb25hbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgIlByZWNpcCBXZXR0ZXN0IFF0ciIsIlByZWNpcCBEcmllc3QgUXRyIiwiUHJlY2lwIFdhcm1lc3QgUXRyIiwKICAgICAgICAgICAgICAgICAgICAiUHJlY2lwIENvbGRlc3QgUXRyIikKCiMgYmlvX2V4dGVudCA8LSBleHRlbnQoeCA9IGMoCiMgICBtaW4oSC5zdXNwX3h5JGxvbmdpdHVkZSksCiMgICBtYXgoSC5zdXNwX3h5JGxvbmdpdHVkZSksCiMgICBtaW4oSC5zdXNwX3h5JGxhdGl0dWRlKSwKIyAgIG1heChILnN1c3BfeHkkbGF0aXR1ZGUpKSkKCmJpb19leHRlbnQgPC0gZXh0ZW50KHggPSBjKAogIG1pbigtMTE4KSwKICBtYXgoLTEwNSksCiAgbWluKDMwKSwKICBtYXgoNDApKSkKCgpiaW9jbGltX2V4dGVudCA8LSBjcm9wKHggPSBiaW9jbGltLCB5ID0gYmlvX2V4dGVudCkKYmlvY2xpbV9tb2RlbCA8LSBiaW9jbGltKHggPSBiaW9jbGltX2V4dGVudCwgcCA9IEguc3VzcF94eSkKcHJlc2VuY2VfbW9kZWwgPC0gZGlzbW86OnByZWRpY3Qob2JqZWN0ID0gYmlvY2xpbV9tb2RlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBiaW9jbGltX2V4dGVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IGJpb19leHRlbnQpCgojIEguc3VzcF9pbmZvCmdwbG90KHByZXNlbmNlX21vZGVsKSArIAogIGdlb21fcmFzdGVyKGFlcyhmaWxsPXZhbHVlKSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gdXMsIGFlcyh4PSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9wb2ludChkYXRhID0gSC5zdXNwX2luZm8sIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUpLCBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzPWMoImJyb3duIiwieWVsbG93IiwiZGFya2dyZWVuIiksICJQcm9iYWJpbGl0eSIpICsKICBjb29yZF9maXhlZCh4bGltID0gYygtMTE3LC0xMDYpLCB5bGltID0gYygzMSwzOSkpICsKICB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKyBnZ3RpdGxlKCJQcm9iYWJpbGl0eSBvZiBHaWxhIE1vbnN0ZXIgT2NjdXJyZW5jZSIpICsgCiAgdGhlbWVfYncoKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCgoKCgojIE92ZXJhbGwgWWVhcmx5IEhvbWUgUmFuZ2VzIChNQ1ApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+U3VtbWFyeSBvZiBob21lIHJhbmdlIHNpemUuPC9zcGFuPgoKVGFibGUgMSB8IFBvb2xlZCBvdmVyYWxsIGhvbWUgcmFuZ2VzIG9mIEdpbGEgTW9uc3RlcnMgYXQgT3dsIEhlYWQgQnV0dGVzIGFuZCBTdG9uZSBDYW55b24gR29sZiBDbHViLiBCb3RoIDEwMCUgYW5kIDk1JSBNQ1BzIHdlcmUgY2FsY3VsYXRlZCBiZXR3ZWVuIGJvdGggcG9wdWxhdGlvbnMuIApgYGB7ciBIb21lIHJhbmdlIHNpemVzIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzIGJ5IHllYXIuLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KR01fdGFibGUgPC0gcmVhZF9jc3YoIkdNX3RhYmxlLmNzdiIpCmthYmxlKEdNX3RhYmxlLGZvcm1hdD0icGFuZG9jIiwgY2FwdGlvbj0nSG9tZSByYW5nZSBzaXplcyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBoZWFkIEJ1dHRlcyB1c2luZyBib3RoIDk1IHBlcmNlbnQgYW5kIDEwMCBwZXJjZW50IE1DUHMuJykKYGBgCgpPdmVyYWxsIGNvbWJpbmVkIG1lYW46CmBgYHtyfQpNZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIpLG5hLnJtID0gVFJVRSkKCk1lYW5zCmBgYAoKCgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkdpbGEgTW9uc3RlciBIb21lIFJhbmdlIFNpemVzIGF0IFN0b25lIENhbnlvbiB2cy4gT3dsIEhlYWQgQnV0dGVzLjwvc3Bhbj4KCgpgYGB7ciBTdG9uZSBDYW55b24gVnMuIE93bCBIZWFkIEJ1dHRlcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KeWVhciA8LSByZWFkX2NzdigiR01fQ29uc29saWRhdGVkX0J5WWVhci5jc3YiKQoKIyBxdWljayBwbG90CkdyYXBoMTwtZ2dwbG90KHllYXIsYWVzKHg9TjEwMCx5PUhvbWVfUmFuZ2VfMTAwbWNwLGdyb3VwPUVudmlyb25tZW50KSkrCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBmYWN0b3IoRW52aXJvbm1lbnQpKSwgc2l6ZSA9IDIpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSkrCiAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKHN1YnNpZGl6ZWQ9ImN5YW4zIixub25zdWJzaWRpemVkPSJpbmRpYW4gcmVkMSIpKSsKICAjIGxhYnModGl0bGUgPSAiMTAwJSBNQ1AgSG9tZSBSYW5nZXMiKSsKICB4bGFiKCJOdW1iZXIgb2YgUmVsb2NhdGlvbnMiKSsKICB5bGFiKCJBcmVhIChoYSkgdXNpbmcgMTAwJSBNQ1AiKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLHNlPUZBTFNFKSsKICBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDIgfCBOb24tU3Vic2lkaXplZCAoT3dsIEhlYWQgQnV0dGVzKSB2cy4gU3Vic2lkaXplZCAoU3RvbmUgQ2FueW9uKSBwb3B1bGF0aW9uIDEwMCUgTUNQcyBhZ2FpbnN0IG51bWJlciBcbiBvZiBmaXhlcyBvZiB0aGUgY29tcGxldGUgZGF0YSBzZXQuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lX2J3KCkKCkdyYXBoMTwtR3JhcGgxK3RoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCgojIGxlZ2VuZCBhdCB0b3AtbGVmdCwgaW5zaWRlIHRoZSBwbG90ClNDT0guaHIuZmlnPC1HcmFwaDEgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC45NSksCiAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIikpClNDT0guaHIuZmlnCiMgZGlyLmNyZWF0ZSgib3V0cHV0cyIpICMgY3JlYXRlIGEgbmV3IGZvbGRlciB0byBob2xkIHRoZSBvdXRwdXQgZmlsZXMKIyBnZ3NhdmUoIm91dHB1dHMvU0NfT0hCX3Bsb3QucGRmIikKYGBgCgoKCgpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBtY3BfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAgbWNwLm91dCA8LSBtY3AoeHksIHBlcmNlbnRhZ2UsIHVub3V0PSJoYSIpCiMgICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsNCkpCiMgICAucm93TmFtZXNERihhcmVhLCBtYWtlLm5hbWVzPVRSVUUpIDwtIGRhdGEkWUVBUgojICAgd3JpdGUudGFibGUoYXJlYSxmaWxlPSJNQ1BfSGVjdGFyZXMuY3N2IiwKIyAgICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiMgICBtY3AucG9pbnRzIDwtIGNiaW5kKChkYXRhLmZyYW1lKHh5KSksZGF0YSRZRUFSKQojICAgY29sbmFtZXMobWNwLnBvaW50cykgPC0gYygieCIsInkiLCAieWVhciIpCiMgICBtY3AucG9seSA8LSBmb3J0aWZ5KG1jcC5vdXQsIHJlZ2lvbiA9ICJpZCIpCiMgICB1bml0cyA8LSBncmlkLnRleHQocGFzdGUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsMiksIiBoYSIpLCB4PTAuOSwgIHk9MC45NSwKIyAgICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRmYWNlPTQsIGNleD0wLjkpLCBkcmF3ID0gRkFMU0UpCiMgICBtY3AucGxvdCA8LSBnZ3Bsb3QoKSArCiMgICAgIGdlb21fcG9seWdvbihkYXRhPW1jcC5wb2x5LCBhZXMoeD1tY3AucG9seSRsb25nLCB5PW1jcC5wb2x5JGxhdCksIGFscGhhPTAuNSkgKwojICAgICBnZW9tX3BvaW50KGRhdGE9bWNwLnBvaW50cywgYWVzKHg9eCwgeT15KSkgKyB0aGVtZV9idygpICsKIyAgICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPW1jcC5wb2ludHMkeWVhcikgKwojICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSkgKwojICAgICBhbm5vdGF0aW9uX2N1c3RvbSh1bml0cykKIyAgIG1jcC5wbG90CiMgfQoKYGBgCgoKCgoKVGFibGUgMiB8IEdyb3VwIDEwMCUgTUNQIGhvbWUgcmFuZ2UgbWVhbnMgb2YgcmF3IGRhdGEgb2YgU3RvbmUgQ2FueW9uIGFuZCBPd2wgSGVhZCBCdXR0ZXMuIEdyb3VwZWQgYnkgZW52aXJvbm1lbnQgYW5kIHNleC4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkoUm1pc2MpCllSX0dSUF9NZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIAogICAgICBjYXB0aW9uID0gJ0dyb3VwIE1lYW5zIG9mIE92ZXJhbGwgMTAwJSBNQ1AgSG9tZSBSYW5nZXMnKQpgYGAKCgoKVGFibGUgMyB8IEdyb3VwIDk1JSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiByYXcgZGF0YSBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KWVJfR1JQX01lYW5zOTUgPC0gc3VtbWFyeVNFKHllYXIsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfOTVtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoIkVudmlyb25tZW50IiwiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zOTUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0dyb3VwIE1lYW5zIG9mIE92ZXJhbGwgOTUlIE1DUCBIb21lCiAgICAgIFJhbmdlcycpCmBgYAoKCgoKCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+R2lsYSBNb25zdGVyIFllYXJseSBIb21lIFJhbmdlIFNoaWZ0cyBvZiAxMDAlIE1DUHMuPC9zcGFuPgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ1JTLlNDPC1DUlMoIitwcm9qPXV0bSArem9uZT0xMiArZWxscHM9V0dTODQgK3VuaXRzPW0gK25vX2RlZnMiKQoKbWNwX2FuYWx5c2lzLlBPTFkgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lLHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICBkYXRhLnNwIDwtIGRhdGFbLCBjKCJMSVpBUkROVU1CRVIiLCAiRUFTVElORyIsICJOT1JUSElORyIpXQogIGNvb3JkaW5hdGVzKGRhdGEuc3ApIDwtIGMoIkVBU1RJTkciLCAiTk9SVEhJTkciKQogIHByb2o0c3RyaW5nKGRhdGEuc3ApIDwtIENSUy5TQwogIG1jcF9vdXQgPC0gbWNwKGRhdGEuc3AsIHBlcmNlbnRhZ2UsIHVub3V0PSJoYSIpCn0KCk0yMTVfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuMTI8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTA0X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEwNC8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTA0LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMTE8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDEyIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuMDc8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvMjAwNyAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyLzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCiMjIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyICpZRUFSKjoKRjEwNF9tY3AuMDhUIDwtIGZvcnRpZnkoRjEwNF9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYxMDRfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMDRfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4wOFQgPC0gZm9ydGlmeShGMTE0X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMDlUIDwtIGZvcnRpZnkoRjExNF9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjEwVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4xMVQgPC0gZm9ydGlmeShGMTE0X21jcC4xMSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMTJUIDwtIGZvcnRpZnkoRjExNF9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMzdfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC4xMFQgPC0gZm9ydGlmeShGMTM3X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuMTFUIDwtIGZvcnRpZnkoRjEzN19tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4xMFQgPC0gZm9ydGlmeShGMTQ3X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMTFUIDwtIGZvcnRpZnkoRjE0N19tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjEyVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjEyLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjA4VCA8LSBmb3J0aWZ5KEYzNl9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMDlUIDwtIGZvcnRpZnkoRjM2X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjM2X21jcC4xMFQgPC0gZm9ydGlmeShGMzZfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjExVCA8LSBmb3J0aWZ5KEYzNl9tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMTJUIDwtIGZvcnRpZnkoRjM2X21jcC4xMiwgcmVnaW9uID0gImlkIikKRjY2X21jcC4wOFQgPC0gZm9ydGlmeShGNjZfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLjA5VCA8LSBmb3J0aWZ5KEY2Nl9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuMTBUIDwtIGZvcnRpZnkoRjY2X21jcC4xMCwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuMDhUIDwtIGZvcnRpZnkoTTExOV9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLjA5VCA8LSBmb3J0aWZ5KE0xMTlfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC4xMFQgPC0gZm9ydGlmeShNMTE5X21jcC4xMCwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuMDdUIDwtIGZvcnRpZnkoTTExMl9tY3AuMDcsIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLjA5VCA8LSBmb3J0aWZ5KE0xMTJfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC4xMFQgPC0gZm9ydGlmeShNMTEyX21jcC4xMCwgcmVnaW9uID0gImlkIikKTTY5X21jcC4wOVQgPC0gZm9ydGlmeShNNjlfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNNjlfbWNwLjEwVCA8LSBmb3J0aWZ5KE02OV9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLjExVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLjExLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC4xMlQgPC0gZm9ydGlmeShNMjE1X21jcC4xMiwgcmVnaW9uID0gImlkIikKCgptY3Auc2hpZnQuVEVTVDQgPC0gZ2dwbG90KCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA4VCwgYWVzKHg9RjEwNF9tY3AuMDhUJGxvbmcsIHk9RjEwNF9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEwNF9tY3AuMDlULCBhZXMoeD1GMTA0X21jcC4wOVQkbG9uZywgeT1GMTA0X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4wOFQsIGFlcyh4PUYxMTRfbWNwLjA4VCRsb25nLCB5PUYxMTRfbWNwLjA4VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjA5VCwgYWVzKHg9RjExNF9tY3AuMDlUJGxvbmcsIHk9RjExNF9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMTBULCBhZXMoeD1GMTE0X21jcC4xMFQkbG9uZywgeT1GMTE0X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4xMVQsIGFlcyh4PUYxMTRfbWNwLjExVCRsb25nLCB5PUYxMTRfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjEyVCwgYWVzKHg9RjExNF9tY3AuMTJUJGxvbmcsIHk9RjExNF9tY3AuMTJUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuMDlULCBhZXMoeD1GMTM3X21jcC4wOVQkbG9uZywgeT1GMTM3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC4xMFQsIGFlcyh4PUYxMzdfbWNwLjEwVCRsb25nLCB5PUYxMzdfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLjExVCwgYWVzKHg9RjEzN19tY3AuMTFUJGxvbmcsIHk9RjEzN19tY3AuMTFUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMDlULCBhZXMoeD1GMTQ3X21jcC4wOVQkbG9uZywgeT1GMTQ3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTBULCBhZXMoeD1GMTQ3X21jcC4xMFQkbG9uZywgeT1GMTQ3X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTFULCBhZXMoeD1GMTQ3X21jcC4xMVQkbG9uZywgeT1GMTQ3X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTJULCBhZXMoeD1GMTQ3X21jcC4xMlQkbG9uZywgeT1GMTQ3X21jcC4xMlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC4wOFQsIGFlcyh4PUYzNl9tY3AuMDhUJGxvbmcsIHk9RjM2X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA5VCwgYWVzKHg9RjM2X21jcC4wOVQkbG9uZywgeT1GMzZfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuMTBULCBhZXMoeD1GMzZfbWNwLjEwVCRsb25nLCB5PUYzNl9tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC4xMVQsIGFlcyh4PUYzNl9tY3AuMTFUJGxvbmcsIHk9RjM2X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEyVCwgYWVzKHg9RjM2X21jcC4xMlQkbG9uZywgeT1GMzZfbWNwLjEyVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuMDhULCBhZXMoeD1GNjZfbWNwLjA4VCRsb25nLCB5PUY2Nl9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC4wOVQsIGFlcyh4PUY2Nl9tY3AuMDlUJGxvbmcsIHk9RjY2X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLjEwVCwgYWVzKHg9RjY2X21jcC4xMFQkbG9uZywgeT1GNjZfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MSkgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTlfbWNwLjA4VCwgYWVzKHg9TTExOV9tY3AuMDhUJGxvbmcsIHk9TTExOV9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTE5X21jcC4wOVQsIGFlcyh4PU0xMTlfbWNwLjA5VCRsb25nLCB5PU0xMTlfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExOV9tY3AuMTBULCBhZXMoeD1NMTE5X21jcC4xMFQkbG9uZywgeT1NMTE5X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTJfbWNwLjA3VCwgYWVzKHg9TTExMl9tY3AuMDdUJGxvbmcsIHk9TTExMl9tY3AuMDdUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTEyX21jcC4wOVQsIGFlcyh4PU0xMTJfbWNwLjA5VCRsb25nLCB5PU0xMTJfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMTBULCBhZXMoeD1NMTEyX21jcC4xMFQkbG9uZywgeT1NMTEyX21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MykgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTY5X21jcC4wOVQsIGFlcyh4PU02OV9tY3AuMDlUJGxvbmcsIHk9TTY5X21jcC4wOVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPU02OV9tY3AuMTBULCBhZXMoeD1NNjlfbWNwLjEwVCRsb25nLCB5PU02OV9tY3AuMTBUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NMjE1X21jcC4xMVQsIGFlcyh4PU0yMTVfbWNwLjExVCRsb25nLCB5PU0yMTVfbWNwLjExVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTIxNV9tY3AuMTJULCBhZXMoeD1NMjE1X21jcC4xMlQkbG9uZywgeT1NMjE1X21jcC4xMlQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICB0aGVtZV9idygpICtsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIikgKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgNCAgfCAgWWVhcmx5IGhvbWUgcmFuZ2Ugc2hpZnRzIG9mIHN1Yi1zYW1wbGVkIGhvbWUgcmFuZ2VzIG9mIDggbGl6YXJkcywgYm90aCBtYWxlcyBhbmQgZmVtYWxlcy4gSG9tZSBcbiByYW5nZSBzaGlmdHMgYXBwZWFyIHRvIGJlIHJlbGF0aXZsZXkgc3RhYmxlIG92ZXIgc3R1ZHkgeWVhcnMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKQoKbWNwLnNoaWZ0LlRFU1Q0CmBgYAoKCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5SZXBlYXRlZCBtZWFzdXJlcyBBTk9WQSBmb3IgWWVhcmx5IEhvbWUgUmFuZ2VzLjwvc3Bhbj4KClJlcGVhdGVkIE1lYXN1cmUgQU5PVkEgZm9yIDEwMCUgTUNQIG92ZXJhbGwgaG9tZSByYW5nZXMKYGBge3IgUmVwZWF0ZWQgTWVhc3VyZXMgQU5PVkEgWUVBUiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgR2V0IHAtdmFsdWVzIGZyb20gbWl4ZWQgbW9kZWwgRiB2YWx1ZXM6CmxpYnJhcnkobG1lNCkKbGlicmFyeShyZWFkcikKeWVhciA8LSByZWFkX2NzdigiR01fQ29uc29saWRhdGVkX0J5WWVhci5jc3YiKQoKUk1tb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzEwMG1jcH5FbnZpcm9ubWVudCtZZWFyK1NleCtOMTAwK0Vudmlyb25tZW50KlNleCsKICAgICAgICAgICAgICAgICAgICgxfEdpbGEpLGRhdGEgPSB5ZWFyKQpzdW1tYXJ5KFJNbW9kLnllYXIpCmBgYAoKCkFOT1ZBIFRhYmxlOiAxMDAlIE1DUApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphbm92YShSTW1vZC55ZWFyKQpgYGAKCgpSZXBlYXRlZCBNZWFzdXJlIEFOT1ZBIGZvciA5NSUgTUNQIG92ZXJhbGwgaG9tZSByYW5nZXMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXI5NTwtbG1lcihIb21lX1JhbmdlXzk1bWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcjk1KQpgYGAKCgpBTk9WQSBUYWJsZTogOTUlIE1DUApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KYW5vdmEoUk1tb2QueWVhcjk1KQpgYGAKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpSTW1vZC55ZWFyMTAwPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KygxfEdpbGEpLGRhdGEgPSB5ZWFyKQoKUk0ubWFyZ2luYWwgPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCAKICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQojIFJNLm1hcmdpbmFsCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fc2V4IDwtIGxzbWVhbnMoUk1tb2QueWVhcjEwMCwgc3BlY3MgPSBjKCJFbnZpcm9ubWVudCIsIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fc2V4IDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9zZXgpKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjEpCgp5ci5tZWFuLmFkajwtZ2dwbG90KHJlZl9kZlJNX3NleCwgYWVzKHg9U2V4LHk9bHNtZWFuLGdyb3VwPUVudmlyb25tZW50KSkrCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBmYWN0b3IoRW52aXJvbm1lbnQpKSwgc2l6ZSA9IDIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjEpLCAKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sc21lYW4tU0UsIHltYXg9bHNtZWFuK1NFKSwgd2lkdGg9LjEscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgIyBnZ3RpdGxlKCJBZGp1c3RlZCBIb21lIFJhbmdlcyBieSBTZXggYW5kIFBvcHVsYXRpb24gKDEwMCUgTUNQKSIpKwogIHhsYWIoIlNleCIpKwogIHlsYWIoIiIpCiAgIyBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDUgIHwgIEFkanVzdGVkIGhvbWUgcmFuZ2VzIHVzaW5nIDEwMCUgTUNQcyBiZXR3ZWVuIHNleGVzIG9mIG5vbi1zdWJzaWRpemVkIGFuZCBzdWJzaWRpemVkIHBvcHVsYXRpb25zLiBcbiBBZGp1c3RlZCBmb3IgZW52aXJvbm1lbnQsIHllYXIsIHNleCwgYW5kIHNhbXBsZSBzaXplLiBNYWxlIGhvbWUgcmFuZ2VzIHJlbWFpbmVkIHNtYWxsZXIgdGhhbiB0aG9zZSBvZiBmZW1hbGVzIGF0IFxuIE93bCBIZWFkIEJ1dHRlcy4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBjb2xvcj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIikpCgojIHlyLm1lYW4uYWRqPC15ci5tZWFuLmFkaiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC45NSksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIikpCiMgeXIubWVhbi5hZGoKIyBybShMU00uWWVhckhSKQoKcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4xKQoKUmF3LlllYXJIUjwtZ2dwbG90KFlSX0dSUF9NZWFucywgYWVzKHg9U2V4LHk9SG9tZV9SYW5nZV8xMDBtY3AsZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSkpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV8xMDBtY3Atc2UsIHltYXg9SG9tZV9SYW5nZV8xMDBtY3Arc2UpLAogICAgICAgICAgICAgICAgd2lkdGg9LjEscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgIyBnZ3RpdGxlKCJPdmVyYWxsIEhvbWUgUmFuZ2VzIGJ5IFNleCBhbmQgUG9wdWxhdGlvbiAoMTAwJSBNQ1ApIikrCiAgeGxhYigiU2V4IikrCiAgeWxhYigiMTAwJSBNQ1AgQXJlYSAoaGEpIikKICAjIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSkKICAjIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgMyB8IFJhdyBvdmVyYWxsIG1lYW4gaG9tZSByYW5nZXMgYmV0d2VlbiBlbnZpcm9ubWVudCBhbmQgc2V4IHVzaW5nIDEwMCUgTUNQcy4gTm90ZSwgdGhhdCBiZWZvcmUgYWRqdXN0ZWQgXG4gaG9tZSByYW5nZXMsIG1hbGVzIGV4aGliaXQgc21hbGxlciBvdmVyYWxsIGhvbWUgcmFuZ2VzIGF0IFN0b25lIENhbnlvbiwgdGhhbiBtYWxlcyBvZiBPd2wgSGVhZCBCdXR0ZXMuIikrCiAgIyB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQoKeXIubWVhbi5yYXc8LVJhdy5ZZWFySFIgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC45NSksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIikpCiMgeXIubWVhbi5yYXcKCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgpncmlkLmFycmFuZ2UoeXIubWVhbi5yYXcsIHlyLm1lYW4uYWRqLCBucm93ID0gMSwgIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dEdyb2IoIkZpZ3VyZSB4IHwgYS4gUmF3IGdyb3VwIG1lYW5zIG9mIG92ZXJhbGwgeWVhcmx5IGhvbWUgcmFuZ2VzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuIE5vdGUgdGhhdCB0aGUgbWFsZSBcbiBob21lIHJhbmdlIG9mIHRoZSBzdWJzaWRpemVkIHBvcHVsYXRpb24gaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZlbWFsZSBob21lIHJhbmdlIGluIHRoZSBub24tc3Vic2lkaXplZCBcbiBwb3B1bGF0aW9uLiBiLiBHcm91cCBtZWFucyBvZiBob21lIHJhbmdlcyBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgZW52aXJvbm1lbnQsIHllYXIsIHNleCwgYW5kIHNhbXBsZSBzaXplLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhY2UgPSAxLGZvbnRzaXplID0gMTApLGhqdXN0ID0gMCwgeCA9IDApKQpgYGAKCgoKCgpUYWJsZSA0LiBEaXJlY3Rpb25hbCBtZWFucyBvZiBob21lIHJhbmdlIGFmdGVyIGJlaW5nIGFkanVzdGVkIGZvciB5ZWFyLCBzZXggYW5kIHNhbXBsZSBzaXplLgpgYGB7ciBlY2hvPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Ka2FibGUocmVmX2RmUk1fc2V4LCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdBZGp1c3RlZCBHcm91cCBNZWFucyBvZiBPdmVyYWxsIEhvbWUgICBSYW5nZXMnKQpgYGAKCiAKICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApQb3N0LUhvYyBjb21wYXJpc29ucyBiZXR3ZWVuIHNleGVzIGFuZCBlbnZpcm9ubWVudDoKYGBge3IgQ29tcHMgZm9yIFNleCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXIuRW08LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKCiMgU2V4LmVtbS5vYSA8LSBlbW1lYW5zKFJNbW9kLnllYXIuRW0sIGMoIkVudmlyb25tZW50IiwiU2V4IikpCiMgcGFpcnMoU2V4LmVtbS5vYSkKCmVtbV9zLnQyIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBTZXggfCBFbnZpcm9ubWVudCkKZW1tX3MudDIKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggV2l0aGluIEVhY2ggRW52aXJvbm1lbnQ6CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQyLCBjb21wYXJpc29ucyA9IFRSVUUsIHhsYWIgPSAiTGVhc3QgU3F1YXJlIE1lYW4gKGhhKSIsIHlsYWIgPSAiRW52aXJvbm1lbnQiKQpgYGAKRmlndXJlIDYgfCBQYWlyd2lzZSBjb21wYXJpc29ucyBvZiBob21lIHJhbmdlIGJldHdlZW4gc2V4ZXMgd2l0aGluIGVhY2ggZW52aXJvbm1lbnQuIElmIHJlZCBhcnJvd3Mgb3ZlcmxhcCB0aG9zZSBvZiBvdGhlcnMsIHRoZW4gIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmVtbV9zLnQzIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MudDMKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zOgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KcGxvdChlbW1fcy50MywgY29tcGFyaXNvbnMgPSBUUlVFLCB4bGFiID0gIkxlYXN0IFNxdWFyZSBNZWFuIChoYSkiLCB5bGFiID0gIkVudmlyb25tZW50IikKYGBgCkZpZ3VyZSA3IHwgUGFpd2lzZSBjb21wYXJpc29ucyBvZiBzZXggYmV0d2VlbiBlbnZpcm9ubWVudHMuIElmIHJlZCBhcnJvd3Mgb3ZlcmxhcCB0aG9zZSBvZiBvdGhlcnMsIHRoZW4gIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAogCiAKIAogCiAKIApBdCBTdG9uZSBDYW55b24sIG1hbGUgeWVhcmx5IGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDEuOTEgLSAyNS4xIGhhLCB3aXRoIGEgbWVhbiBvZiAxMS44IMKxIDEuNyBTLkUuIGhhICgxMDAlIE1DUCksIDkuMiDCsSAxLjMgUy5FLiBIYSAoOTUlIE1DUCkuIEZlbWFsZSBob21lIHJhbmdlcyByYW5nZWQgZnJvbSAyLjA2IOKAkyAzOC44MSBoYSBhbmQgYSBtZWFuIG9mIDkuOCDCsSAxLjEgUy5FLiBoYSAoMTAwJSBNQ1ApLCA3LjEgwrEgMC43IFMuRS4gaGEgKDk1JSBNQ1ApLiBNYWxlIEdpbGEgTW9uc3RlcnMgYXQgT3dsIGhlYWQgQnV0dGVzIGhhZCBob21lIHJhbmdlcyB0aGF0IHJhbmdlZCBmcm9tIDEwLjYg4oCTIDgyLjcgaGEgd2l0aCBhIG1lYW4gb2YgNDMuMiDCsSA1LjcgUy5FLiBoYSAoMTAwJSBNQ1ApLCA0MS45IMKxIDQuOSBTLkUuIGhhICg5NSUgTUNQKS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDcuMSDigJMgNDcuNiB3aXRoIGEgbWVhbiBvZiAyMi4wIMKxIDMuNyBTLkUuIGhhICgxMDAlIE1DUCksIDIwLjYgwrEgMi41IFMuRS4gaGEgKDk1JSBNQ1ApLiBJbiB0aGUgYW5hbHlzZXMgb2YgYm90aCBwb3B1bGF0aW9ucywgeWVhciBoYWQgbm8gZWZmZWN0IG9uIGhvbWUgcmFuZ2Ugc2l6ZXMgKEYgPSAwLjM4LCBQID0gMC41NCksIHdoaWxlIHRoZXJlIHdhcyBhIGRldGVjdGVkIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gaG9tZSByYW5nZXMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zIChGID0gOC4zNSwgUCA9IDAuMDA1KSwgYXMgd2VsbCBhcyBzZXggKEYgPSAxNi42OCwgUCA9IDAuMDAwNCkuIFBvc3QtSG9jIGFuYWx5c2VzIGJldHdlZW4gc2V4ZXMgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtYWxlIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMgKGRmID0gNjguMywgUCA9IDAuMDAxKS4gVGhlcmUgd2FzIGEgc2xpZ2h0IGRpZmZlcmVuY2Ugb2YgZmVtYWxlIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMsIGhvd2V2ZXIgaXQgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChkZiA9IDY4LjcsIFAgPSAwLjA3KS4gQXQgc3RvbmUgY2FueW9uIHRoZXJlIHdhcyBubyBtYWpvciBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGhvbWUgcmFuZ2VzIChkZiA9IDMxLjgsIFAgPSAwLjE2KSB3aXRoIG1hbGUgaG9tZSByYW5nZSBiZWluZyBvbmx5IDMlIGxhcmdlciB0aGFuIGZlbWFsZXMuIE1hbGVzIGF0IE93bCBIZWFkIEJ1dHRlcyBoYWQgYSA2NSUgbGFyZ2VyIGhvbWUgcmFuZ2UgdGhhbiBkaWQgZmVtYWxlcywgYW5kIHdhcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChkZiA9IDMxLjMsIFAgPSAwLjAwMDMpLiBJbnRlcmVzdGluZ2x5LCBtYWxlcyBhdCBTdG9uZSBDYW55b24gaGFkIHNtYWxsZXIgaG9tZSByYW5nZXMgdGhhbiBkaWQgdGhlIGZlbWFsZXMgYXQgT3dsIEhlYWQgQnV0dGVzIChUYWJsZSB4KSBXaGVuIHVzaW5nIDk1JSBNQ1BzLCBtYWxlIGhvbWUgcmFuZ2VzIHJlZHVjZWQgYnkgMjUlIGFuZCBmZW1hbGUgcmFuZ2UgYnkgMzElLiBBdCBPd2wgSGVhZCBCdXR0ZXMsIEdpbGEgTW9uc3RlcnMgc2hvd2VkIGEgc2ltaWxhciBiZWhhdmlvciB3aXRoIG1hbGUgaG9tZSByYW5nZXMgcmVkdWNlZCBieSAyMCUgYW5kIGZlbWFsZSByYW5nZXMgcmVkdWNlZCBieSAyNiUgdXNpbmcgOTUlIE1DUHMuIAogIAogCiAKIAoKIAogCiMjIE92ZXJhbGwgWWVhcmx5IEhvbWUgUmFuZ2VzIChLREUpCgoKSG9tZSByYW5nZSBlc3RpbWF0aW9uIG9uIHRoZSBTdG9uZSBDYW55b24gR2lsYSBNb25zdGVycyB1c2luZyA5NSUgS0RFcyB3aXRoIGhyZWYgYmFuZHdpZHRoIHByb2R1Y2VkIG1hbGUgaG9tZSByYW5nZXMgcmFuZ2luZyBmcm9tIDE0LjUg4oCTIDU1LjMgaGEgd2l0aCBhIG1lYW4gb2YgMzUuMCDCsSAzLjMgUy5FLiBoYS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDEwLjEg4oCTIDQ3LjggaGEgd2l0aCBhIG1lYW4gb2YgMjIuOSDCsSAxLjggUy5FLiBLREUgZXN0aW1hdGVzIGZvciBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgd2VyZSA5NiUgYW5kIDgwJSBsYXJnZXIgdGhhbiBNQ1AgZXN0aW1hdGVzLiBSZXBlYXRlZCBNZWFzdXJlcyBhbmFseXNpcyBvZiBLREVzIHN1Z2dlc3RlZCB0aGF0IHRoZXJlIHdhcyBhIHNtYWxsIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uIChGID0gNS41NiwgUCA9IDAuMDA5KS4gWWVhciBkaWQgbm90IGhhdmUgYW4gZWZmZWN0IG9uIGhvbWUgcmFuZ2VzIChGID0gMC41NywgUCA9IDAuNDUpLiAKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnllYXIua2RlPC1yZWFkX2NzdigneWVhcmx5IGtkZSB0YWJsZS5jc3YnKQprYWJsZSh5ZWFyLmtkZSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnWWVhcmx5IEtERSBIb21lIFJhbmdlcycpCmBgYAoKCgoKCgpUYWJsZSAgfCBSYXcgR3JvdXAgOTUlIEtERSBob21lIHJhbmdlIG1lYW5zIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzLiBHcm91cGVkIGJ5IGVudmlyb25tZW50IGFuZCBzZXguCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpzdWIgPC0gc3Vic2V0KHllYXIsIEVudmlyb25tZW50ID09ICJzdWJzaWRpemVkIikKCllSX0dSUF9NZWFucy5LREUgPC0gc3VtbWFyeVNFKHN1YiwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NWtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zLktERSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnUmF3IEdyb3VwIE1lYW5zIG9mIE92ZXJhbGwgOTUlIEtERSBIb21lCiAgICAgIFJhbmdlcycpCmBgYAogCgoKIAogCiAKIAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+UmVwZWF0ZWQgbWVhc3VyZXMgQU5PVkEgZm9yIEtERSBIb21lIFJhbmdlcy48L3NwYW4+CgpSZXBlYXRlZCBNZWFzdXJlIEFOT1ZBIGZvciA5NSUgS0RFIG92ZXJhbGwgaG9tZSByYW5nZXMKYGBge3IgUmVwZWF0ZWQgTWVhc3VyZXMgQU5PVkEgS0RFLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKClJNLktERW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+WWVhcitTZXgrTisoMXxHaWxhKSxkYXRhID0gc3ViKQoKc3VtbWFyeShSTS5LREVtb2QueWVhcikKYGBgCiAKQU5PVkEgVGFibGUgZm9yIDk1JSBLREUgKHN1YnNpZGl6ZWQpCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5LREVtb2QueWVhcikKYGBgCgogIAogCiAKIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZ3JpZCkKClJhdy5LREUuSFI8LWdncGxvdChZUl9HUlBfTWVhbnMuS0RFLCBhZXMoeD1TZXgseT1Ib21lX1JhbmdlXzk1a2RlKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjEpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfOTVrZGUtc2UsIHltYXg9SG9tZV9SYW5nZV85NWtkZStzZSksCiAgICAgICAgICAgICAgICB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIk92ZXJhbGwgSG9tZSBSYW5nZXMgYnkgU2V4IGFuZCBQb3B1bGF0aW9uICgxMDAlIE1DUCkiKSsKICB4bGFiKCJTZXgiKSsKICB5bGFiKCI5NSUgS0RFIEFyZWEgKGhhKSIpKwogICAjIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgOCAgfCAgUmF3IDk1JSBLREUgaG9tZSByYW5nZXMgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBjb2xvcj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIikpCgpSYXcuS0RFLkhSPC1SYXcuS0RFLkhSICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKQojIFJhdy5LREUuSFIKClJNLktERW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+WWVhcitTZXgrTisoMXxHaWxhKSxkYXRhID0gc3ViKQoKS0RFLm1hcmdpbmFsIDwtIGxzbWVhbnMoUk0uS0RFbW9kLnllYXIsIAogICAgICAgICAgICAgICAgICAgIH4gU2V4KQojIFJNLm1hcmdpbmFsCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fS0RFIDwtIGxzbWVhbnMoUk0uS0RFbW9kLnllYXIsIHNwZWNzID0gYygiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9LREUgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX0tERSkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCkxTTS5LREUuSFI8LWdncGxvdChyZWZfZGZSTV9LREUsIGFlcyh4PVNleCx5PWxzbWVhbikpKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjEpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIkFkanVzdGVkIEhvbWUgUmFuZ2VzIGJ5IFNleCBhbmQgUG9wdWxhdGlvbiAoMTAwJSBNQ1ApIikrCiAgeGxhYigiU2V4IikrCiAgeWxhYigiIikKICAjIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgOCAgfCAgQWRqdXN0ZWQgOTUlIEtERSBob21lIHJhbmdlcyBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsIGhvbWUgcmFuZ2VzIGF0IFN0b25lIENhbnlvbi4gQWRqdXN0ZWQgb24geWVhciwgXG4gc2V4LCBhbmQgc2FtcGxlIHNpemUuIikrCiAgIyB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQogICMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpKQoKIyBMU00uS0RFLkhSPC1MU00uS0RFLkhSICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyBMU00uS0RFLkhSCgpncmlkLmFycmFuZ2UoUmF3LktERS5IUiwgTFNNLktERS5IUiwgbnJvdyA9IDEsICAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRHcm9iKCJGaWd1cmUgeCB8IGEuIFJhdyBncm91cCBtZWFucyBvZiBvdmVyYWxsIHllYXJseSA5NSUgS0RFcyBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzIGF0IFN0b25lIENhbnlvbi4gXG4gYi4gQWRqdXN0ZWQgOTUlIEtERXMgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yICB5ZWFyLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRmYWNlID0gMSxmb250c2l6ZSA9IDEwKSxoanVzdCA9IDAsIHggPSAwKSkKYGBgCgogCiAKIApUYWJsZSAgfCBEaXJlY3Rpb25hbCBtZWFucyBvZiBLREUgaG9tZSByYW5nZXMgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuCmBgYHtyIGVjaG89RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQprYWJsZShyZWZfZGZSTV9LREUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0FkanVzdGVkIEtERSBHcm91cCBNZWFucyBvZiBPdmVyYWxsIEhvbWUgUmFuZ2VzJykKYGBgCiAKIAoKCgoKIAogCiAKIAojIFNlYXNvbmFsIEhvbWUgUmFuZ2UKIAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+U2Vhc29uYWwgSG9tZSBSYW5nZS48L3NwYW4+CgoKSG9tZSByYW5nZSBhbmFseXNpcyBicm9rZW4gZG93biBieSBmaXZlIHNlYXNvbnM7IEVtZXJnZW5jZSwgRHJ5LCBNb25zb29uLCBQb3N0IE1vbnNvb24uIFRoZSBzdGFydCBvZiBlbWVyZ2VuY2Ugd2FzIGRlZmluZWQgYnkgd2hlbiBtb3ZlbWVudCBwYXR0ZXJucyBpbmNyZWFzZWQgZnJvbSBub25lL21pbmltYWwgdG8gdGhlIHN0YXJ0IG9mIGhpZ2ggYWN0aXZpdHkuIEVmZm9ydCB3YXMgdGFrZW4gdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0byB0aGUgT3dsIEhlYWQgQnV0dGVzIGVtZXJnZW5jZSBkYXRlIGludGVydmFsLiBNb25zb29uIHNlYXNvbiB3YXMgYWRqdXN0ZWQgdXNpbmcgTk9BQSBjbGltYXRlIGRhdGEuIFRoZSBzdGFydCBvZiB3YXMgZGVmaW5lZCB3aGVuIHRoZSBtZWFuIGRldyBwb2ludCB0ZW1wZXJhdHVyZXMgb2YgdGhyZWUgY29uc2VjdXRpdmUgZGF5cyB3ZXJlIGdyZWF0ZXIgdGhhbiA1NSBkZWdyZWVzLiAKClNjYWxpbmcgaG9tZSByYW5nZSBhbmFseXNlcyBieSBzZWFzb25hbCBlc3RpbWF0ZXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9yIGxvY2F0aW9ucyBmb3IgZWFjaCBsaXphcmQuIDEwMCUgTUNQcyB3ZXJlIHVzZWQgZm9yIHNlYXNvbmFsIGhvbWUgcmFuZ2UgYW5hbHlzZXMgdG8gYXZvaWQgYW55IGZ1cnRoZXIgcmVkdWN0aW9uIG9mIGxvY2F0aW9ucyBmb3IgZWFjaCBlc3RpbWF0aW9uLgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyBDcmVhdGUgTUNQIHBvbHlnb25zIGJ5IFNFQVNPTjoKTTIxNV9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCk0xMTJfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyL01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpNMTE5X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjExNF9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMTM3X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYxNDdfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjI1Ml9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMzZfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYzNl9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYzNl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGNjZfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkY2Nl9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkY2Nl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgojIyBGb3J0aWZ5IG1jcCBwb2x5Z29ucyBmb3IgZ2dwbG90MiAqU0VBU09OKjoKTTIxNV9tY3AuRU1UIDwtIGZvcnRpZnkoTTIxNV9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLkRSWVQgPC0gZm9ydGlmeShNMjE1X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLk1PTlQgPC0gZm9ydGlmeShNMjE1X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCgpNMTEyX21jcC5EUllUIDwtIGZvcnRpZnkoTTExMl9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC5NT05UIDwtIGZvcnRpZnkoTTExMl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC5QTVQgPC0gZm9ydGlmeShNMTEyX21jcC5QTSwgcmVnaW9uID0gImlkIikKCk0xMTlfbWNwLkRSWVQgPC0gZm9ydGlmeShNMTE5X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLk1PTlQgPC0gZm9ydGlmeShNMTE5X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLlBNVCA8LSBmb3J0aWZ5KE0xMTlfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjExNF9tY3AuRU1UIDwtIGZvcnRpZnkoRjExNF9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTE0X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTE0X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjEzN19tY3AuRU1UIDwtIGZvcnRpZnkoRjEzN19tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTM3X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTM3X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjE0N19tY3AuRU1UIDwtIGZvcnRpZnkoRjE0N19tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTQ3X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTQ3X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjI1Ml9tY3AuRU1UIDwtIGZvcnRpZnkoRjI1Ml9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLkRSWVQgPC0gZm9ydGlmeShGMjUyX21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLk1PTlQgPC0gZm9ydGlmeShGMjUyX21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLlBNVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjM2X21jcC5FTVQgPC0gZm9ydGlmeShGMzZfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLkRSWVQgPC0gZm9ydGlmeShGMzZfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjM2X21jcC5NT05UIDwtIGZvcnRpZnkoRjM2X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuUE1UIDwtIGZvcnRpZnkoRjM2X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkY2Nl9tY3AuRU1UIDwtIGZvcnRpZnkoRjY2X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjY2X21jcC5EUllUIDwtIGZvcnRpZnkoRjY2X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuTU9OVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLlBNVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgptY3Auc2hpZnQuVEVTVDUgPC0gZ2dwbG90KCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLkVNVCwgYWVzKHg9RjExNF9tY3AuRU1UJGxvbmcsIHk9RjExNF9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5EUllULCBhZXMoeD1GMTE0X21jcC5EUllUJGxvbmcsIHk9RjExNF9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5NT05ULCBhZXMoeD1GMTE0X21jcC5NT05UJGxvbmcsIHk9RjExNF9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLlBNVCwgYWVzKHg9RjExNF9tY3AuUE1UJGxvbmcsIHk9RjExNF9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuRU1ULCBhZXMoeD1GMTM3X21jcC5FTVQkbG9uZywgeT1GMTM3X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLkRSWVQsIGFlcyh4PUYxMzdfbWNwLkRSWVQkbG9uZywgeT1GMTM3X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLk1PTlQsIGFlcyh4PUYxMzdfbWNwLk1PTlQkbG9uZywgeT1GMTM3X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuUE1ULCBhZXMoeD1GMTM3X21jcC5QTVQkbG9uZywgeT1GMTM3X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5FTVQsIGFlcyh4PUYxNDdfbWNwLkVNVCRsb25nLCB5PUYxNDdfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuRFJZVCwgYWVzKHg9RjE0N19tY3AuRFJZVCRsb25nLCB5PUYxNDdfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuTU9OVCwgYWVzKHg9RjE0N19tY3AuTU9OVCRsb25nLCB5PUYxNDdfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5QTVQsIGFlcyh4PUYxNDdfbWNwLlBNVCRsb25nLCB5PUYxNDdfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuRU1ULCBhZXMoeD1GMjUyX21jcC5FTVQkbG9uZywgeT1GMjUyX21jcC5FTVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuRFJZVCwgYWVzKHg9RjI1Ml9tY3AuRFJZVCRsb25nLCB5PUYyNTJfbWNwLkRSWVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuTU9OVCwgYWVzKHg9RjI1Ml9tY3AuTU9OVCRsb25nLCB5PUYyNTJfbWNwLk1PTlQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NCkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuUE1ULCBhZXMoeD1GMjUyX21jcC5QTVQkbG9uZywgeT1GMjUyX21jcC5QTVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuRU1ULCBhZXMoeD1GMzZfbWNwLkVNVCRsb25nLCB5PUYzNl9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLkRSWVQsIGFlcyh4PUYzNl9tY3AuRFJZVCRsb25nLCB5PUYzNl9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLk1PTlQsIGFlcyh4PUYzNl9tY3AuTU9OVCRsb25nLCB5PUYzNl9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuUE1ULCBhZXMoeD1GMzZfbWNwLlBNVCRsb25nLCB5PUYzNl9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5FTVQsIGFlcyh4PUY2Nl9tY3AuRU1UJGxvbmcsIHk9RjY2X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuRFJZVCwgYWVzKHg9RjY2X21jcC5EUllUJGxvbmcsIHk9RjY2X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuTU9OVCwgYWVzKHg9RjY2X21jcC5NT05UJGxvbmcsIHk9RjY2X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5QTVQsIGFlcyh4PUY2Nl9tY3AuUE1UJGxvbmcsIHk9RjY2X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICB0aGVtZV9idygpICsKICBsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIikgKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgIHwgIFNlYXNvbmFsIGhvbWUgcmFuZ2Ugc2hpZnRzIG9mIGZpdmUgbGl6YXJkcy4gRW1lcmdlbmNlIGFuZCBwb3N0LW1vbnNvb24gcmFuZ2VzIHN0YXkgcmVhbGF0aXZlbHkgd2l0aGluIFxuIGVhY2ggb3RoZXIuIEFsbCBzZWFzb25hbCBwb2x5Z29ucyBzdGF5IHJlbGF0aXZlbHkgc3RhYmxlIHdpdGhvdXQgYW55IG1ham9yIHNoaWZ0cyBhd2F5IGZyb20gb3RoZXIgc2Vhc29uYWwgcmFuZ2VzLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKQoKbWNwLnNoaWZ0LlRFU1Q1CmBgYAoKCgoKCgoKU2Vhc29uYWwgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uIHZhcmllZCBpbiBzaXplIGJldHdlZW4gc2Vhc29ucyBidXQgZGlkIG5vdCBzZWVtIHNoaWZ0IChGaWcuX19fKSwgd2l0aCBzZWFzb25hbCBob21lIHJhbmdlcyBvdmVybGFwcGluZyBlYWNoIG90aGVyLCBvbmx5IGV4cGFuZGluZyBvciBjb2xsYXBzaW5nIGJldHdlZW4gc2Vhc29ucy4gSG9tZSByYW5nZSBwYXR0ZXJucyBhdCBTdG9uZSBDYW55b24gZGlkIG5vdCBkaXNwbGF5IHRoZSBzYW1lIHNlYXNvbmFsIHZhcmlhdGlvbiBpbiBob21lIHJhbmdlIHNpemVzIHRoYXQgd2FzIG9ic2VydmVkIGF0IE93bCBIZWFkIEJ1dHRlcy4gQXQgU3RvbmUgQ2FueW9uLCBHaWxhIE1vbnN0ZXJzIGhhZCByZWxhdGl2ZWx5IHNtYWxsZXIgaG9tZSByYW5nZXMgdGhyb3VnaG91dCB0aGUgeWVhciwgd2hlcmUgdGhlIGhpZ2hlc3QgaW5mbGF0aW9uIG9mIHJhbmdlIHNpemUgd2FzIG9ic2VydmVkIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiBmcm9tIGFuIGluY3JlYXNlIGluIG1hbGUgaG9tZSByYW5nZXMsIDE4LjIgwrEgNS40IFMuRS4gaGEgdG8gdGhhdCBvZiBmZW1hbGUgaG9tZSByYW5nZSBzaXplcyBhdCAxMC4xIMKxIDIuNCBTLkUuIGhhLiBGZW1hbGVzIGF0IFN0b25lIENhbnlvbiBkaXNwbGF5ZWQgc2ltaWxhciBob21lIHJhbmdlcyBkdXJpbmcgdGhlIG1vbnNvb24gc2Vhc29uLCAxMC42IMKxIDIuNSBTLkUuIGhhLiBIb21lIHJhbmdlIHNpemVzIGF0IE93bCBIZWFkIEJ1dHRlcyBoYWQgYSBtdWNoIGxhcmdlciBhbW91bnQgb2YgdmFyaWF0aW9uIGFjcm9zcyBzZWFzb25zIHRoYW4gZGlkIHRob3NlIGF0IFN0b25lIENhbnlvbi4gVGhlcmUgd2VyZSBzdGlsbCBzbGlnaHRseSBsYXJnZXIgcmFuZ2VzIG9ic2VydmVkIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiwgcHJpbWFyaWx5IGR1ZSB0byBpbmNyZWFzZWQgaG9tZSByYW5nZSBzaXplcyBleGhpYml0ZWQgYnkgbWFsZXMgMjkuNCDCsSA0LjcgUy5FLiBoYSB2ZXJzdXMgZmVtYWxlcyBhdCAxNS42IMKxIDMuOCBTLkUuIGhhLiBEdXJpbmcgdGhlIG1vbnNvb24gc2Vhc29uLCB0aGVyZSB3YXMgc3RpbGwgeWV0IGEgbGFyZ2UgaW5mbHV4IG9mIGhvbWUgcmFuZ2VzIHNpemVzIHdoZXJlIGZlbWFsZSBob21lIHJhbmdlcyBpbmNyZWFzZWQgdG8gMjIuOSDCsSA0LjAgUy5FLiBoYS4gIEZvciBib3RoIHBvcHVsYXRpb25zLCBob21lIHJhbmdlcyBkdXJpbmcgdGhlIGVtZXJnZW5jZSBhbmQgcG9zdC1tb25zb29uIHNlYXNvbnMgd2VyZSBzbWFsbCwgbWFya2luZyB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgb2Ygb3ZlcndpbnRlcmluZyBwZXJpb2RzLCB3aGVyZSBtaW5pbWFsIG1vdmVtZW50IGlzIG9ic2VydmVkIGluIGJvdGggZ3JvdXBzLiAKICAKQW5hbHlzaXMgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGFuIGVmZmVjdCBvZiBzZWFzb24gKGRmID0gMywgRiA9IDE1LjQxLCBQID0gPDAuMDAxKSBhcyB3ZWxsIGFzIGFuIGludGVyYWN0aW9uIG9mIGVudmlyb25tZW50IGFuZCBzZWFzb24gKGRmID0gMywgRiA9IDYuODQsIFAgPSA8MC4wMDEpLCBpbmRpY2F0aW5nIHRoYXQgY2hhbmdlcyBpbiBzZWFzb25hbCBob21lIHJhbmdlcyBzaXplcyB2YXJpZWQgYmV0d2VlbiBlYWNoIGVudmlyb25tZW50LiBQb3N0LUhvYyBhbmFseXNlcyBvbiB0aGUgU3RvbmUgQ2FueW9uIGRhdGEgc2V0IHdpdGggaG9tZSByYW5nZSBtZWFucyBhdmVyYWdlZCBhY3Jvc3Mgc2V4LCBzdWdnZXN0ZWQgdGhhdCB0aGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBob21lIHJhbmdlcyBiZXR3ZWVuIHRoZSBlbWVyZ2VuY2UgKDQuMzIgwrEgMi41NSBTLkUuIGhhKSBhbmQgcG9zdC1tb25zb29uIHNlYXNvbnMgKDUuMDkgwrEgMi4wNyBTLkUuIGhhKSBub3IgZHJ5IGFuZCBtb25zb29uICgxMi4yMyDCsSAxLjc0IFMuRS4gaGEgYW5kIDkuMDQgwrEgMS43OCBTLkUuIGhhKS4gVGhlcmUgd2FzIGFsc28gbm8gc2lnbmlmaWNhbmNlIGJldHdlZW4gZW1lcmdlbmNlIGFuZCBkcnkvbW9uc29vbiBzZWFzb25zLCBidXQgdGhlcmUgd2FzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGRyeSBhbmQgcG9zdC1tb25zb29uIChkZiA9IDgwLjIsIFAgPSAwLjA0KS4gUG9zdC1Ib2MgYW5hbHlzZXMgb24gdGhlIE93bCBIZWFkIEJ1dHRlcyBwb3B1bGF0aW9uIGluZGljYXRlZCB0aGF0IHRoZXJlIHdhcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZW1lcmdlbmNlICgzLjMzIMKxIDIuMjQgUy5FLiBoYSkgYW5kIHBvc3QtbW9uc29vbiAoMi4zNiDCsSAyLjM2IFMuRS4pIG5vciBkcnkgYW5kIG1vbnNvb24gKDE4Ljg2IMKxIDIuMjUgUy5FLiBoYSBhbmQgMjEuODUgwrEgMi4wMyBTLkUuIGhhKSByZWZsZWN0aW5nIHRoZSBzYW1lIHBhdHRlcm4gYXQgU3RvbmUgQ2FueW9uLiBIb3dldmVyLCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZW1lcmdlbmNlIGFuZCBkcnkvbW9uc29vbiAoZGYgPSA2OS40LCBQID0gPDAuMDAwMSwgYW5kIGRmID0gNjgsIFAgPSA8MC4wMDAxIHJlc3BlY3RpdmVseSksIGFzIHdlbGwgYXMgcG9zdC1tb25zb29uIGFuZCBkcnkvbW9uc29vbiAoZGYgPSA3OC45LCBQID0gPDAuMDAwMSwgYW5kIGRmID0gNzQsIFAgPSA8MC4wMDAxKS4gVGhpcyBzaG93cyBhIHJhdGhlciBkaWZmZXJlbnQgcGF0dGVybiB0aGFuIHNlZW4gYXQgU3RvbmUgQ2FueW9uLiBQYWlyd2lzZSBhbmFseXNlcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMgaW5kaWNhdGVkIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBlbWVyZ2VuY2UgKGRmID0gODcuNywgUCA9IDAuNzYpIG9yIHBvc3QtbW9uc29vbiAoZGYgPSA4OS40LCBQID0gMC4zNSkuIERpZmZlcmVuY2VzIGluIGhvbWUgcmFuZ2Ugc2l6ZXMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zIHdlcmUgYmV0d2VlbiB0aGUgZHJ5IGFuZCBtb25zb29uIHNlYXNvbnMgKEZpZy5fX18pLiAgT3dsIEhlYWQgaG9tZSByYW5nZXMgd2VyZSA1OCUgbGFyZ2VyIHRoYW4gdGhvc2UgYXQgU3RvbmUgQ2FueW9uIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiwgYW5kIDc2JSBsYXJnZXIgZHVyaW5nIHRoZSBtb25zb29uIHNlYXNvbi4gCiAgCgoKCgpUYWJsZSA1IHwgR3JvdXAgbWVhbnMgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiBTdG9uZSBDYW55b24gKHN1YnNpZGl6ZWQpIGFuZCBPd2wgSGVhZCBCdXR0ZXMgKG5vbi1zdWJzaWRpemVkKS4gVGhlc2UgbWVhbnMgYXJlIGF2ZXJhZ2VkIGFjcm9zcyBzZXguIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpsaWJyYXJ5KFJtaXNjKQoKU0VBU19HUlBfTWVhbnMgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZWFzb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnUmF3IEdyb3VwIE1lYW5zIG9mIFNlYXNvbmFsIEhvbWUgUmFuZ2VzJykKYGBgCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobG1lclRlc3QpCiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQpzdW1tYXJ5KFJNLm1vZC5TZWFzb24pCgojIGFub3ZhKFJNLm1vZC5TZWFzb24pCgojICMgbWFyZ2luYWwuc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgCiMgIyAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyAjIG1hcmdpbmFsLnNlYXNvbgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5tb2QuU2Vhc29uKQpgYGAKCgoKCgoKClRhYmxlIDYgfCBTZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkgcG9wdWF0aW9ucyBmb3IgbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXNlIGFyZSByYXcgbWVhbnMgYmVmb3JlIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgc2Vhc29uLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClNFQVNfR1JQX1RFU1QgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX1RFU1QsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1NlYXNvbmFsIE1lYW5zIGJ5IFNleCBCZXR3ZWVuIFBvcHVsYXRpb25zJykKYGBgCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQoKcGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4zKSAjIG1vdmUgdGhlbSAuMDUgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0ICgnZG9kZ2VzJykKCiMjIFRFU1QgMwpyYXcuc2Vhc29uYWw8LWdncGxvdChTRUFTX0dSUF9URVNULGFlcyh4PUVudmlyb25tZW50LCB5PUhvbWVfUmFuZ2VfMTAwbWNwLCBzaGFwZT1TZXgpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSAyLCBwb3NpdGlvbj1wZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV8xMDBtY3Atc2UsIHltYXg9SG9tZV9SYW5nZV8xMDBtY3Arc2UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoJ2JsYWNrJywncmVkJykpICsKICBmYWNldF9ncmlkKH5TZWFzb24pICsKICAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDgsMTkpKSsKICBsYWJzKGNhcHRpb24gPSAiRmlndXJlICB8ICBSYXcgc2Vhc29uYWwgbWVhbnMgb2Ygc2V4ZXMgYmV0d2VlbiBlYWNoIGVudmlyb25tZW50LiBIb21lIHJhbmdlcyBvZiB0aGUgc3Vic2lkZXplZCBwb3B1bGF0aW9uIHJlbWFpbiBcbiByZWxhdGl2ZWx5IHNtYWxsIHRocm91Z2hvdXQgdGhlIHNlYXNvbnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGRyeSBzZWFzb24gd2hlcmUgd2Ugb2JzZXJ2ZSBpbmNyZWFzZWQgbWFsZSBcbiBob21lIHJhbmdlcy4gVGhlIG5vbi1zdWJzaWRpemVkIHBvcHVsYXRpb24gZXhoaWJpdHMgYSBsYXJnZSBhbW91bnQgb2YgdmFyaWF0aW9uIGFjcm9zcyBzZWFzb25zLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwogICMgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygnRW1lcmdlbmNlJywnRHJ5JywnTW9uc29vbicsJ1Bvc3RfTW9uc29vbicpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTEuNSwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuNSksIGhqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIHhsYWIoIkVudmlyb25tZW50IikgKyB5bGFiKCJBcmVhIChoYSkgdXNpbmcgMTAwJSBNQ1AiKQpyYXcuc2Vhc29uYWwKYGBgCgoKCgoKQWRqdXN0ZWQgU2Vhc29uYWwgTWVhbnMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyBSYXcgc2Vhc29uYWwgbWVhbnMKIyBwZCA8LSBwb3NpdGlvbl9kb2RnZSgwLjMpICMgbW92ZSB0aGVtIC4wNSB0byB0aGUgbGVmdCBhbmQgcmlnaHQgKCdkb2RnZXMnKQojIAojIyBURVNUIDMKIyByYXcuc2Vhc29uYWw8LWdncGxvdChTRUFTX0dSUF9URVNULGFlcyh4PUVudmlyb25tZW50LCB5PUhvbWVfUmFuZ2VfMTAwbWNwLCBzaGFwZT1TZXgpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gMiwgcG9zaXRpb249cGQpICsKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV8xMDBtY3Atc2UsIHltYXg9SG9tZV9SYW5nZV8xMDBtY3Arc2UpLCBwb3NpdGlvbiA9IHBkLAojICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKwojICAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoJ2JsYWNrJywncmVkJykpICsKIyAgIGZhY2V0X2dyaWQoflNlYXNvbikgKwojICAgIyAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDgsMTkpKSsKIyAgICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAgfCAgUmF3IHNlYXNvbmFsIG1lYW5zIG9mIHNleGVzIGJldHdlZW4gZWFjaCBlbnZpcm9ubWVudC4gSG9tZSByYW5nZXMgb2YgdGhlIHN1YnNpZGV6ZWQgcG9wdWxhdGlvbiByZW1haW4gXG4gcmVsYXRpdmVseSBzbWFsbCB0aHJvdWdob3V0IHRoZSBzZWFzb25zLCB3aXRoIHRoZSBleGNlcHRpb24gZHVyaW5nIHRoZSBkcnkgc2Vhc29uIHdoZXJlIHdlIG9ic2VydmUgaW5jcmVhc2VkIG1hbGUgXG4gaG9tZSByYW5nZXMuIFRoZSBub24tc3Vic2lkaXplZCBwb3B1bGF0aW9uIGV4aGliaXRzIGEgbGFyZ2UgYW1vdW50IG9mIHZhcmlhdGlvbiBhY3Jvc3Mgc2Vhc29ucy4iKSsKIyAgIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwojICAgIyBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCdFbWVyZ2VuY2UnLCdEcnknLCdNb25zb29uJywnUG9zdF9Nb25zb29uJykpICsKIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg3LC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTEuNSwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuNSksIGhqdXN0ID0gMC41KSwKIyAgICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiMgICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAojICAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKIyAgICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAojICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwojICAgeGxhYigiIikgKyB5bGFiKCIiKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIEFqdXN0ZWQgc2Vhc29uYWwgbWVhbnMKUk0ubW9kLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1NlYXNvbitTZXgrTitFbnZpcm9ubWVudCpTZWFzb24rKDF8R2lsYSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQoKIyBSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNLm1vZC5TZWFzb24sIAojICAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyBSTS5tYXJnaW5hbAoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX3NlYXNvbiA8LSBsc21lYW5zKFJNLm1vZC5TZWFzb24sIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZWFzb24iLCJTZXgiKSkKCiMgcmVmUk1fc2V4CnJlZl9kZlJNX3NlYXNvbiA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkocmVmUk1fc2Vhc29uKSkKcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4yKQoKYWRqLnNlYXNvbmFsPC1nZ3Bsb3QocmVmX2RmUk1fc2Vhc29uLGFlcyh4PUVudmlyb25tZW50LCB5PWxzbWVhbiwgc2hhcGU9U2V4KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gMiwgcG9zaXRpb249cGQsIHNob3cubGVnZW5kPVRSVUUpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgZmFjZXRfZ3JpZCh+U2Vhc29uKSArCmxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgIHwgQWRqdXN0ZWQgc2Vhc29uYWwgaG9tZSByYW5nZSBtZWFucyBvZiBzZXhlcyBiZXR3ZWVuIGVudmlyb25tZW50cy4gSG9tZSByYW5nZXMgb2YgdGhlIHN1YnNpZGV6ZWQgXG4gcG9wdWxhdGlvbiByZW1haW4gcmVsYXRpdmVseSBzbWFsbCB0aHJvdWdob3V0IHRoZSBzZWFzb25zLiBBZnRlciBhZGp1c3RtZW50IG1hbGUgaG9tZSByZWFuZ2VzIHdlcmUgcmVkdWNlZCwgXG4gYnV0IHN0aWxsIHJlbWFpbmVkIHNsaWdodGx5IGxhcmdlciB0aGVuIGZlbWFsZXMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiAgIyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyg4LDE5KSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTEuNSwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuNSksIGhqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIHhsYWIoIkVudmlyb25tZW50IikgKyB5bGFiKCJBcmVhIChoYSkgdXNpbmcgMTAwJSBNQ1AiKQphZGouc2Vhc29uYWwKCiMgQ29tYmluZSByYXcgYW5kIGFkanVzdGVkIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIHdpdGggYSBzaW5nbGUgY2FwdGlvbjoKIyBncmlkLmFycmFuZ2UocmF3LnNlYXNvbmFsLCBhZGouc2Vhc29uYWwsIG5yb3cgPSAyLGhlaWdodHM9dW5pdChjKDIsMiksIGMoImluIiwgImluIikpLAojICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0R3JvYigiIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRmYWNlID0gMSxmb250c2l6ZSA9IDEwKSxoanVzdCA9IDAsIHggPSAwKSkKCiMgbGlicmFyeShndGFibGUpCiMgZzIgPC0gZ2dwbG90R3JvYihyYXcuc2Vhc29uYWwpCiMgZzMgPC0gZ2dwbG90R3JvYihhZGouc2Vhc29uYWwpCiMgZyA8LSByYmluZChnMiwgZzMsIHNpemUgPSAiZmlyc3QiKQojIGckd2lkdGhzIDwtIHVuaXQucG1heChnMiR3aWR0aHMsIGczJHdpZHRocykKIyBncmlkLm5ld3BhZ2UoKQojIGdyaWQuZHJhdyhnKQoKYGBgCgoKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApQb3N0LUhvYyBjb21wYXJpc29ucyBiZXR3ZWVuIHBvcHVsYXRpb25zIGZvciBzZWFzb25hbCBob21lIHJhbmdlIGFuYWx5c2lzOgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmVtbV9zLnQgPC0gZW1tZWFucyhSTS5tb2QuU2Vhc29uLCBwYWlyd2lzZSB+IEVudmlyb25tZW50IHwgU2Vhc29uKQplbW1fcy50CmBgYAoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBzZWFzb25zIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW5zOgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBwbG90KFNleC5lbW0uc2VhcywgY29tcGFyaXNvbnMgPSBUUlVFKQpwbG90KGVtbV9zLnQsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkZpZ3VyZSAxMSB8IFBhaXJ3aXNlIGNvbXBhcmlzb25zIG9mIGVhY2ggc2Vhc29uIGJldHdlZW4gZW52aXJvbm1lbnRzLiBPdmVybGFwcGluZyByZWQgYmFycyBpbmRpY2F0ZSBubyBzdGF0aXN0aWNhbCBkaWZmZXJlbmNlLiAKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIFNlYXMuTWVhbnNUPC1lbW1lYW5zKFJNLm1vZC5TZWFzb24sIGxpc3QocGFpcndpc2UgfiBFbnZpcm9ubWVudCwgcGFpcndpc2UgfiBTZWFzb24pKQojIFNlYXMuTWVhbnNUCgplbW1fcy50NCA8LSBlbW1lYW5zKFJNLm1vZC5TZWFzb24sIHBhaXJ3aXNlIH4gU2Vhc29uIHwgRW52aXJvbm1lbnQpCmVtbV9zLnQ0CmBgYAoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBiZXR3ZWVuIHNlYXNvbnMgd2l0aGluIHRoZSB0d28gcG9wdWxhdGlvbnM6CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQ0LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYApGaWd1cmUgMTIgfCBQYWlyd2lzZSBjb21wYXJpc29ucyBiZXR3ZWVuIHNlYXNvbnMgd2l0aGluIGVhY2ggZW52aXJvbm1lbnQgYWdhaW5zdCBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMuIE92ZXJsYXBwaW5nIHJlZCBiYXJzIGluZGljYXRlIG5vIHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAoKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kc3ViIDwtIHN1YnNldChzZWFzb25hbCwgRW52aXJvbm1lbnQgPT0gInN1YnNpZGl6ZWQiKQoKUk0ubW9kLlN1YiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwflNlYXNvbitTZXgrTitTZWFzb24qU2V4KygxfEdpbGEpLCBkYXRhPXN1YikKCmVtbV9zLnQ1IDwtIGVtbWVhbnMoUk0ubW9kLlN1YiwgcGFpcndpc2UgfiBTZXggfCBTZWFzb24pCmVtbV9zLnQ1IApgYGAKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBiZXR3ZWVuIHNleCB3aXRoaW4gdGhlIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbjoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBsb3QoZW1tX3MudDUsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgICAgCiAgIAogICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClRhYmxlIDcgfCBNZWFuIGluZGl2aWR1YWwgc2Vhc29uYWwgaG9tZSByYW5nZXMgcG9vbGVkIGZyb20gdGhlIGVudGlyZSBzdHVkeSBwZXJpb2QuIE1pc3NpbmcgdmFsdWVzIGFyZSBkZXBpY3RlZCB3aGVyZSBubyBsb2NhdGlvbnMgZm9yIHRoYXQgYW5pbWFsIGR1cmluZyB0aGF0IHBlcmlvZCB3ZXJlIHN1Y2Nlc3NmdWxsLgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KU2Vhcy5JbmQuTWVhbnM8LXJlYWQuY3N2KCJTZWFzb25hbCBIUiBUYWJsZS5jc3YiKQprYWJsZShTZWFzLkluZC5NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnU2Vhc29uYWwgSW5kaXZpZHVhbCBIb21lIFJhbmdlcyAoTUNQKS4nKQpgYGAKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kbm9uc3ViIDwtIHN1YnNldChzZWFzb25hbCwgRW52aXJvbm1lbnQgPT0gIm5vbnN1YnNpZGl6ZWQiKQoKUk0ubW9kLk5TdWIgPC0gbG1lcihIb21lX1JhbmdlXzEwMG1jcH5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgZGF0YT1ub25zdWIpCgplbW1fcy50NiA8LSBlbW1lYW5zKFJNLm1vZC5OU3ViLCBwYWlyd2lzZSB+IFNleCB8IFNlYXNvbikKZW1tX3MudDYgCmBgYAoKR3JhcGhpY2FsIENvbXBhcmlzb25zIGJldHdlZW4gc2V4IHdpdGhpbiB0aGUgbm9uLXN1YnNpZGl6ZWQgcG9wdWxhdGlvbjoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBsb3QoZW1tX3MudDYsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgICAgCgoKCgoKIyMgU2Vhc29uYWwgSG9tZSBSYW5nZSAoS0RFKQoKClRhYmxlICB8IFJhdyBLREUgZ3JvdXAgbWVhbnMgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiBzZXhlcyBhdCBTdG9uZSBDYW55b24gKHN1YnNpZGl6ZWQpLgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kc2Vhc29uLmtkZTwtcmVhZC5jc3YoIlNDX1NlYXNvbmFsX0lucHV0LmNzdiIpCgpTRUFTX0tERV9TZXggPC0gc3VtbWFyeVNFKHNlYXNvbi5rZGUsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfOTVrZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfS0RFX1NleCwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnUmF3IEtERSBHcm91cCBNZWFucyBvZiBTZWFzb25hbCBIb21lIFJhbmdlcyBiZXR3ZWVuIHNleGVzJykKYGBgCgogCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpTRUFTX0tERV9NZWFucyA8LSBzdW1tYXJ5U0Uoc2Vhc29uLmtkZSwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NWtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2Vhc29uIiksIG5hLnJtID0gVFJVRSkKCiMgU0VBU19HUlBfTWVhbnMKa2FibGUoU0VBU19LREVfTWVhbnMsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1JhdyBLREUgR3JvdXAgTWVhbnMgb2YgU2Vhc29uYWwgSG9tZSBSYW5nZXMnKQpgYGAKIAogCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIHNlYXNvbmFsPC1yZWFkLmNzdigiU0NfU2Vhc29uYWxfRGF0YS5jc3YiKQoKUk0uS0RFLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfOTVrZGV+U2Vhc29uK1NleCtOK1NlYXNvbipTZXgrKDF8R2lsYSksIAogICAgICAgICAgICAgICAgICAgICAgZGF0YT1zZWFzb24ua2RlKQpzdW1tYXJ5KFJNLktERS5TZWFzb24pCmBgYAogCkFOT1ZBIFRhYmxlLiBTZWFzb25hbCBLREUKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmFub3ZhKFJNLktERS5TZWFzb24pCmBgYAoKIAoKUmF3IFNlYXNvbmFsIEtERSBNZWFucwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KZ2dwbG90KFNFQVNfS0RFX1NleCxhZXMoeD1TZXgsIHk9SG9tZV9SYW5nZV85NWtkZSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMiwgcG9zaXRpb249cGQpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfOTVrZGUtc2UsIHltYXg9SG9tZV9SYW5nZV85NWtkZStzZSksIHBvc2l0aW9uID0gcGQsCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKyAKICBmYWNldF9ncmlkKH5TZWFzb24pICsKICB0aGVtZV9idygpICsKICB4bGFiKCJTZXgiKSArIHlsYWIoIkFyZWEgKGhhKSB1c2luZyA5NSUgS0RFIikKYGBgCgoKCgoKQWRqdXN0ZWQgU2Vhc29uYWwgS0RFIE1lYW5zCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpSTS5LREUuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV85NWtkZX5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbi5rZGUpCgojIFJNLm1hcmdpbmFsIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgCiMgICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQojIFJNLm1hcmdpbmFsCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fS0RFIDwtIGxzbWVhbnMoUk0uS0RFLlNlYXNvbiwgc3BlY3MgPSBjKCJTZWFzb24iLCJTZXgiKSkKCiMgcmVmUk1fc2V4CnJlZl9kZlJNX0tERSA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkocmVmUk1fS0RFKSkKcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4yKQoKZ2dwbG90KHJlZl9kZlJNX0tERSxhZXMoeD1TZXgsIHk9bHNtZWFuKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbj1wZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bHNtZWFuLVNFLCB5bWF4PWxzbWVhbitTRSksIHBvc2l0aW9uID0gcGQsCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKyAKICBmYWNldF9ncmlkKH5TZWFzb24pICsKICB4bGFiKCJTZXgiKSArIHlsYWIoIkFyZWEgKGhhKSB1c2luZyA5NSUgS0RFIikKYGBgCgogCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KZW1tX3NleF9LREUgPC0gZW1tZWFucyhSTS5LREUuU2Vhc29uLCBwYWlyd2lzZSB+IFNleCB8IFNlYXNvbikKZW1tX3NleF9LREUgCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBsb3QoZW1tX3NleF9LREUsIGNvbXBhcmlzb25zPVRSVUUpCmBgYAoKCgoKCgojIEhvbWUgUmFuZ2UgT3ZlcmxhcCAoTUNQKQoKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5HaWxhIE1vbnN0ZXIgSG9tZSBSYW5nZSBPdmVybGFwIG9mIDEwMCUgTUNQcy48L3NwYW4+CgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KCm1jcF9hbmFseXNpcy5QT0xZIDwtIGZ1bmN0aW9uKGZpbGVuYW1lLCBwZXJjZW50YWdlKXsKICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgZGF0YS5zcCA8LSBkYXRhWywgYygiTElaQVJETlVNQkVSIiwgIkVBU1RJTkciLCAiTk9SVEhJTkciKV0KICBjb29yZGluYXRlcyhkYXRhLnNwKSA8LSBjKCJFQVNUSU5HIiwgIk5PUlRISU5HIikKICBwcm9qNHN0cmluZyhkYXRhLnNwKSA8LSBDUlMuU0MKICBtY3Bfb3V0IDwtIG1jcChkYXRhLnNwLCBwZXJjZW50YWdlLCB1bm91dD0iaGEiKQp9CgpNNjdfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NNjcvTTY3IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk02OV9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL002OS9NNjkgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTI1NV9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL00yNTUvTTI1NSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMjE1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTIxNS9NMjE1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0xNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL00xNC9NMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL00xMTkvTTExOSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMTEyX01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTExMi9NMTEyIC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCgpGNjZfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GNjYvRjY2IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYzNl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YzNi9GMzYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YyNTIvRjI1MiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMjE0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjIxNC9GMjE0IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYyMDBfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMjAwL0YyMDAgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxNDcvRjE0NyAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTQ2X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjE0Ni9GMTQ2IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTM3L0YxMzcgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzNV9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMzUvRjEzNSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTE0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjExNC9GMTE0IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTA0L0YxMDQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKCk1hbGUuTUNQIDwtIHJiaW5kKE02N19NQ1AsTTY5X01DUCxNMjU1X01DUCxNMjE1X01DUCxNMTRfTUNQLE0xMTlfTUNQLE0xMTJfTUNQKQpGZW1hbGUuTUNQIDwtIHJiaW5kKEY2Nl9NQ1AsRjM2X01DUCxGMjUyX01DUCxGMjE0X01DUCxGMjAwX01DUCxGMTQ3X01DUCxGMTQ2X01DUCxGMTM3X01DUCwKICAgICAgICAgICAgICAgICAgICBGMTM1X01DUCxGMTE0X01DUCxGMTA0X01DUCkKCm1hcHZpZXdPcHRpb25zKGJhc2VtYXBzID0gYygiT3BlblN0cmVldE1hcCIsIkVzcmkuV29ybGRJbWFnZXJ5IiwiT3BlblRvcG9NYXAiKSwKICAgICAgICAgICAgICAgbmEuY29sb3IgPSAibWFnZW50YSIsCiAgICAgICAgICAgICAgIGxheWVycy5jb250cm9sLnBvcyA9ICJ0b3BsZWZ0IikKCm1hcHZpZXcoTWFsZS5NQ1AsIGxlZ2VuZD1GLCB6Y29sPSJpZCIsIGNvbC5yZWdpb25zID0gYygiYmx1ZSIpLCBhbHBoYS5yZWdpb25zPTAuMykgKyAKICBtYXB2aWV3KEZlbWFsZS5NQ1AsIGxlZ2VuZD1GLCB6Y29sID0gImlkIiwgY29sLnJlZ2lvbnMgPSBjKCJyZWQiKSwgYWxwaGEucmVnaW9ucz0wLjMpCmBgYApGaWd1cmUgMTMgfCBJbnRlcmFjdGl2ZSBtYXA6IEhvbWUgUmFuZ2Ugb3ZlcmxhcCBieSBzZXggb2YgMTAwJSBNQ1BzIGF0IFN0b25lIENhbnlvbi4gUmVkIHBvbHlnb25zIHJlcHJlc2VudCBmZW1hbGUgbGl6YXJkcywgYW5kIGJsdWUgcmVwcmVzZW50cyBtYWxlIGxpemFyZHMuIAoKCgoKClRoZSBTdG9uZSBDYW55b24gcG9wdWxhdGlvbiBzZWVtcyB0byBleGhpYml0IGdyZWF0ZXIgZmVtYWxlLWZlbWFsZSBvdmVybGFwIGFzIHdlbGwgYXMgY29uc2lkZXJhYmxlIG92ZXJsYXAgb2YgbWFsZS1mZW1hbGUgaG9tZSByYW5nZXMuIFRoZXJlIGFwcGVhcnMgdG8gYmUgbGltaXRlZCBtYWxlLW1hbGUgb3ZlcmxhcCwgd2l0aCBvY2N1cmFuY2UgaGFwcGVuaW5nIGluIG9ubHkgdHdvIG1hbGUtbWFsZSBob21lIHJhbmdlIHBvbHlnb25zLiBUaGlzIGZpbmRpbmcgaXMgaW4gY29udHJhc3QgdG8gdGhlIE93bCBIZWFkIGJ1dHRlcyBzdHVkeSB3aGljaCByZXZlYWxlZCB0aGF0IHRoZXJlIHdhcyBhIGxhcmdlIGRlZ3JlZSBvZiBvdmVybGFwIGFtb25nIG1hbGUtZmVtYWxlIGFuZCBtYWxlLW1hbGUgb3ZlcmxhcHMgKFRhYmxlIHgpLiBHaWxsYXJkbyBjb25jbHVkZWQgdGhhdCwgaW4gdGhlaXIgc3R1ZHksIHRoZSBoaWdoIGRlZ3JlZSBvZiBvdmVybGFwIGluIG1hbGVzLW1hbGVzIGludGVyYWN0aW9ucyBtYXkgYmUgZHVlIHRvIGhhdmluZyBsYXJnZXIgaG9tZSByYW5nZXMgZm9yIG1hdGUgc2VhcmNoaW5nIGFjdGl2aXRpZXMuIE1hbGVzIG1heSBoYXZlIGFuZCBpbmNyZWFzZWQgaG9tZSByYW5nZSBzaXplIHRvIG1heGltaXplIHRoZWlyIGFjY2VzcyB0byBtdWx0aXBsZSBmZW1hbGVzLiBTaGUgY29uY2x1ZGVkIHRoYXQgdGhlIGxhY2sgb2YgZmVtYWxlLWZlbWFsZSBvdmVybGFwIG1heSBiZSBkdWUgdG8gc21hbGxlciBob21lIHJhbmdlIHNpemVzLiAKCkF0IFN0b25lIENhbnlvbiwgbWFsZXMgaGF2ZSByZWR1Y2VkIGhvbWUgcmFuZ2Ugc2l6ZXMgKFRhYmxlIDY7IEZpZy4gNCkuIEhvd2V2ZXIsIG1hbGVzIHN0aWxsIHJldGFpbiBob21lIHJhbmdlIG92ZXJsYXAgd2l0aCBtdWx0aXBsZSBmZW1hbGVzIHdoaWxlIGhhdmluZyByZWR1Y2VkIGNvbnRhY3Qgd2l0aCBvdGhlciBtYWxlcy4gVGhpcyBtYXkgYmUgaW4gcmVzcG9uc2UgdG8gbnV0cmllbnQgc3Vic2lkaWVzIHRoYXQgcmVkdWNlIHRoZSBuZWVkIHRvIGhhdmUgZXhwYW5kZWQgaG9tZSByYW5nZSBzaXplcyBmb3IgZm9yYWdpbmcgYWN0aXZpdGllcyBmb3IgYm90aCBtYWxlcyBhbmQgZmVtYWxlcy4gVGhlcmUgbWF5IGFsc28gYmUgYSBoaWdoZXIgZGVuc2l0eSBvZiBmZW1hbGVzIGFzIGEgcmVzcG9uc2UgdG8gcmVzb3VyY2UgYXZhaWxhYmlsaXR5IGFuZCByZWR1Y2VkIHJhbmdlIHJlcXVpcmVtZW50cy4gTWFsZXMgYXJlIG5vdCBmb3JjZWQgdG8gZXhwYW5kIGhvbWUgcmFuZ2VzIGZvciBtYXRlIHNlYXJjaGluZyB0byB0aGUgZXh0YW50IHRoYXQgaW5kaXZpZHVhbHMgYXQgT3dsIEhlYWQgQnV0dGVzIG1heSBiZSBzdWJqZWN0IHRvLiAKCgoKVGFibGUgOCB8IEhvbWUgcmFuZ2Ugb3ZlcmxhcCBvZiBHaWxhIE1vbnN0ZXJzIGF0IHRoZSBudXRyaWVudCBzdWJzaWRpemVkIHNpdGUuIE1hbGUtbWFsZSBvdmVybGFwcyBvbmx5IG9jY3VyZWQgYmV0d2VlbiB0d28gcGFpcnMgb2YgbWFsZXM6IE0xNC1NNjkgYW5kIE0xMTktTTIxNSBhdCAwLjUgaGEuIGFuZCAxOS41IGhhLiByZXNwZWN0aXZlbHkgYW5kIHdlcmUgdGhlcmVmb3JlIG5vdCBpbmNsdWRlZCBpbiB0aGUgdGFibGUuIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KT0xfVGFibGU8LXJlYWQuY3N2KCIuL092ZXJsYXAvT3ZlckxhcF9UYWJsZS5jc3YiKQoKa2FibGUoT0xfVGFibGUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0hvbWUgcmFuZ2Ugb3ZlcmxhcCBvZiBTdG9uZSBDYW55b24gR2lsYSBNb25zdGVycyB1c2luZyAxMDAlIE1DUHMuJykKYGBgCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpoci5vdmVybGFwPC1yZWFkLmNzdigiLi9PdmVybGFwL0hSX092ZXJsYXBfRGF0YS5jc3YiKQoKaHIub3ZlcmxhcC5hbmFsIDwtIHN1bW1hcnlTRShoci5vdmVybGFwLCBtZWFzdXJldmFyPSJPTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiSW50ZXJhY3Rpb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShoci5vdmVybGFwLmFuYWwsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0hvbWUgUmFuZ2UgT3ZlcmxhcCBTdW1tYXJ5JykKYGBgCgoKCgojIEhvbWUgUmFuZ2UgT3ZlcmxhcCAoS0RFKQoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQoKa2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbiA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAga2RlPC1rZXJuZWxVRChkYXRhLnNwLCBoPSJocmVmIiwga2Vybj0iYml2bm9ybSIsIGdyaWQ9MTAwMCkKICB2ZXIgPC0gZ2V0dmVydGljZXNocihrZGUsIHBlcmNlbnRhZ2UpCiAgdmVyQHByb2o0c3RyaW5nPC1DUlMuU0MKICB2ZXIKfQoKTTY3X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjcvTTY3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTY5X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjkvTTY5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTI1NV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTIxNV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTIxNS9NMjE1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTE0X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTQvTTE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExOV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExMl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExMi9NMTEyIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKCkY2Nl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjY2L0Y2NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYzNl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyNTJfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyNTIvRjI1MiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMTQvRjIxNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMDBfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDcvRjE0NyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDZfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDYvRjE0NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzVfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzUvRjEzNSAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMTQvRjExNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMDRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCgpNYWxlLktERSA8LSByYmluZChNNjdfS0RFLE02OV9LREUsTTI1NV9LREUsTTIxNV9LREUsTTE0X0tERSxNMTE5X0tERSxNMTEyX0tERSkKRmVtYWxlLktERSA8LSByYmluZChGNjZfS0RFLEYzNl9LREUsRjI1Ml9LREUsRjIxNF9LREUsRjIwMF9LREUsRjE0N19LREUsRjE0Nl9LREUsRjEzN19LREUsCiAgICAgICAgICAgICAgICAgICAgRjEzNV9LREUsRjExNF9LREUsRjEwNF9LREUpCgptYXB2aWV3T3B0aW9ucyhiYXNlbWFwcyA9IGMoIk9wZW5TdHJlZXRNYXAiLCJFc3JpLldvcmxkSW1hZ2VyeSIsIk9wZW5Ub3BvTWFwIiksCiAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIm1hZ2VudGEiLAogICAgICAgICAgICAgICBsYXllcnMuY29udHJvbC5wb3MgPSAidG9wbGVmdCIpCgptYXB2aWV3KE1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbD0iaWQiLCBjb2wucmVnaW9ucyA9IGMoImJsdWUiKSwgYWxwaGEucmVnaW9ucz0wLjMpICsgCiAgbWFwdmlldyhGZW1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbCA9ICJpZCIsIGNvbC5yZWdpb25zID0gYygicmVkIiksIGFscGhhLnJlZ2lvbnM9MC4zKQpgYGAKRmlndXJlIDE0IHwgSW50ZXJhY3RpdmUgbWFwOiBIb21lIFJhbmdlIG92ZXJsYXAgYnkgc2V4IG9mIDk1JSBLREVzIGF0IFN0b25lIENhbnlvbi4gUmVkIHBvbHlnb25zIHJlcHJlc2VudCBmZW1hbGUgbGl6YXJkcywgYW5kIGJsdWUgcmVwcmVzZW50cyBtYWxlIGxpemFyZHMuIAoKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQoKIyBrZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiMgICBrZGVAcHJvajRzdHJpbmc8LSBDUlMuU0MKIyAgIGtkZQojIH0KCk0xMTIucmFzdGVyLm91dHB1dDwta2RlX2FuYWx5c2lzLmhyZWYucmFzdGVyKCIuL00xMTIvTTExMiAuY3N2IikKRjExNC5yYXN0ZXIub3V0cHV0PC1rZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIoIi4vRjExNC9GMTE0IC5jc3YiKQpGMjAwLnJhc3Rlci5vdXRwdXQ8LWtkZV9hbmFseXNpcy5ocmVmLnJhc3RlcigiLi9GMjAwL0YyMDAgLmNzdiIpCiMgcGxvdChNMTEyLnJhc3Rlci5vdXRwdXQpCiMgbWFwdmlldyhNMTEyLnJhc3Rlci5vdXRwdXQsIGFscGhhLnJlZ2lvbnM9MC44KQoKTTExMi5yYXN0ZXI8LXJhc3RlcihNMTEyLnJhc3Rlci5vdXRwdXQpCkYxMTQucmFzdGVyPC1yYXN0ZXIoRjExNC5yYXN0ZXIub3V0cHV0KQpGMjAwLnJhc3RlcjwtcmFzdGVyKEYyMDAucmFzdGVyLm91dHB1dCkKCgpsaWJyYXJ5KHRtYXApCiMgY3JlYXRlcyBhIGJvdW5kaW5nIGJveCBiYXNlZCBvbiB0aGUgZXh0ZW50cyBvZiB0aGUgcG9seWdvbgojYm91bmRpbmdfYm94IDwtIGJiKE91dHB1dC5BcmVhcykKTTExMi5iYiA8LSBNMTEyX0tERUBiYm94CkYxMTQuYmIgPC0gRjExNF9LREVAYmJveApGMjAwLmJiIDwtIEYyMDBfS0RFQGJib3gKCgojIG1hcHMgdGhlIHJhc3RlciB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveAojIHRtX3NoYXBlKE0xMTIucmFzdGVyLCBiYm94ID0gTTExMi5iYikgKyB0bV9yYXN0ZXIoInVkIikKCiMgbWFzayB0aGUgcmFzdGVyIGJ5IHRoZSBvdXRwdXQgYXJlYSBwb2x5Z29uCk0xMTIubWFza2VkIDwtIG1hc2soTTExMi5yYXN0ZXIsIE0xMTJfS0RFKQojIE0xMTIubWFza2VkW2lzLm5hKE0xMTIubWFza2VkKV0gPC0gMApGMTE0Lm1hc2tlZCA8LSBtYXNrKEYxMTQucmFzdGVyLCBGMTE0X0tERSkKIyBGMTE0Lm1hc2tlZFtpcy5uYShGMTE0Lm1hc2tlZCldIDwtIDAKRjIwMC5tYXNrZWQgPC0gbWFzayhGMjAwLnJhc3RlciwgRjIwMF9LREUpCiMgRjIwMC5tYXNrZWRbaXMubmEoRjIwMC5tYXNrZWQpXSA8LSAwCgpwbG90KE0xMTIubWFza2VkKQojIG1hcHZpZXcoTTExMi5tYXNrZWQsIGFscGhhLnJlZ2lvbnM9MC42KQoKdG1fbGF5b3V0KG1haW4udGl0bGU9Ik0xMTIgRjExNCBhbmQgRjIwMCBLREUgT3ZlcmxhcCIpK3RtX3NoYXBlKE0xMTIubWFza2VkKSArCiAgdG1fcmFzdGVyKCJ1ZCIsIHN0eWxlID0gInF1YW50aWxlIiwgbiA9IDEwMCwgbGVnZW5kLnNob3cgPSBGQUxTRSwgcGFsZXR0ZSA9ICItWWxHbkJ1IikgKwogIHRtX3NoYXBlKEYxMTQubWFza2VkKSArIAogIHRtX3Jhc3RlcigidWQiLCBzdHlsZSA9ICJxdWFudGlsZSIsIG4gPSAxMDAsIGxlZ2VuZC5zaG93ID0gRkFMU0UsIHBhbGV0dGUgPSAiLVlsR25CdSIpICsKICB0bV9zaGFwZShGMjAwLm1hc2tlZCkgKwogIHRtX3Jhc3RlcigidWQiLCBzdHlsZSA9ICJxdWFudGlsZSIsIG4gPSAxMDAsIGxlZ2VuZC5zaG93ID0gRkFMU0UsIHBhbGV0dGUgPSAiLVlsR25CdSIpICsKICB0bV9zaGFwZShNMTEyX0tERSkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS4zLCBjb2wgPSAiYmxhY2siKSArIAogIHRtX3NoYXBlKEYxMTRfS0RFKSArIAogIHRtX2JvcmRlcnMoYWxwaGE9LjMsIGNvbCA9ICJibGFjayIpICsgCiAgdG1fc2hhcGUoRjIwMF9LREUpICsgCiAgdG1fYm9yZGVycyhhbHBoYT0uMywgY29sID0gImJsYWNrIikgKwogIHRtX2xheW91dChmcmFtZSA9IEZBTFNFKQogIAojICwgYmJveCA9IE0xMTIuYmIKIyBjb21wdXRlIGhvbWVyYW5nZXMgZm9yIDUwJSwgOTUlIG9mIHBvaW50cywgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYXMgc3BhdGlhbCBwb2x5Z29uIGRhdGEgZnJhbWVzCk0xMTIucmFuZ2U5NSA8LSBnZXR2ZXJ0aWNlc2hyKE0xMTIucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDk1KQpNMTEyLnJhbmdlNTAgPC0gZ2V0dmVydGljZXNocihNMTEyLnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA1MCkKRjExNC5yYW5nZTk1IDwtIGdldHZlcnRpY2VzaHIoRjExNC5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gOTUpCkYxMTQucmFuZ2U1MCA8LSBnZXR2ZXJ0aWNlc2hyKEYxMTQucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDUwKQpGMjAwLnJhbmdlOTUgPC0gZ2V0dmVydGljZXNocihGMjAwLnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA5NSkKRjIwMC5yYW5nZTUwIDwtIGdldHZlcnRpY2VzaHIoRjIwMC5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gNTApCgp0bV9sYXlvdXQobWFpbi50aXRsZT0iTTExMiBGMTE0IGFuZCBGMjAwIEtERSBPdmVybGFwIikrCnRtX3NoYXBlKE0xMTIucmFuZ2U5NSkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2ZiNmE0YSIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNmYjZhNGEiKSArCnRtX3NoYXBlKE0xMTIucmFuZ2U1MCkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2RlMmQyNiIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNkZTJkMjYiKSArCnRtX2xheW91dChmcmFtZSA9IEZBTFNFKSArCnRtX3NoYXBlKEYxMTQucmFuZ2U5NSkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2ZiNmE0YSIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNmYjZhNGEiKSArCnRtX3NoYXBlKEYxMTQucmFuZ2U1MCkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2RlMmQyNiIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNkZTJkMjYiKSArCnRtX2xheW91dChmcmFtZSA9IEZBTFNFKSArIAp0bV9zaGFwZShGMjAwLnJhbmdlOTUpICsgdG1fYm9yZGVycyhhbHBoYT0uNywgY29sID0gIiNmYjZhNGEiLCBsd2QgPSAyKSArIHRtX2ZpbGwoYWxwaGE9LjEsIGNvbCA9ICIjZmI2YTRhIikgKwp0bV9zaGFwZShGMjAwLnJhbmdlNTApICsgdG1fYm9yZGVycyhhbHBoYT0uNywgY29sID0gIiNkZTJkMjYiLCBsd2QgPSAyKSArIHRtX2ZpbGwoYWxwaGE9LjEsIGNvbCA9ICIjZGUyZDI2IikgKwp0bV9sYXlvdXQoZnJhbWUgPSBGQUxTRSkKCiMjIHdyaXRlIHJhc3RlciBmaWxlcyB0byBjb21wdXRlcjogCiMgd3JpdGVSYXN0ZXIobWFza2VkX2tkZSwgZmlsZW5hbWUgPSAia2VybmVsX2RlbnNpdHkudGlmIikKYGBgCgoKCgo=